天天看點

關于c#泛類型參數T的限制

c#支援泛式程式設計,在我們定義泛型類時,可以加入泛類型參數T的限制。為什麼需要參數限制呢,官方是這麼說的:

如果要檢查泛型清單中的某個項以确定它是否有效,或者将它與其他某個項進行比較,則編譯器必須在一定程度上保證它需要調用的運算符或方法将受到用戶端代碼可能指定的任何類型參數的支援。

當執行個體化類時用于類型參數的類型種類施加限制。如果實作代碼嘗試使用某個限制所不允許的類型來執行個體化類,則會産生編譯時錯誤。限制是使用 where 上下文關鍵字指定的。下面列出了六種類型的限制:

T:結構

 類型參數必須是值類型。可以指定除 Nullable 以外的任何值類型。

示例:public class TestClass<T> where T : int

 T:類

 類型參數必須是引用類型;這一點也适用于任何類、接口、委托或數組類型。

示例:public class TestClass<T> where T : class

 T:new()

 類型參數必須具有無參數的公共構造函數。當與其他限制一起使用時,new() 限制必須最後指定。

示例:public class TestClass<T> where T : ITestClass, new()

 T:<基類名>

 類型參數必須是指定的基類或派生自指定的基類。

示例:public class TestClass<T> where T : ITestClass

 T:<接口名稱>

 類型參數必須是指定的接口或實作指定的接口。可以指定多個接口限制。限制接口也可以是泛型的。

 示例:public class TestClass<T> where T : System.IComparable 

 T:U

 為 T 提供的類型參數必須是為 U 提供的參數或派生自為 U 提供的參數。這稱為裸類型限制。

示例:public class TestClass<T, U,> where T : U{ }

參考msdn位址:msdn.microsoft.com/zh-cn/library/d5x73970.aspx

繼續閱讀