啥叫泛型約束:就是你必須要符合這個規則來,不然就不讓你編譯通過 。
以上見解來自水木大哥
我們經常可以看到這樣的代碼
public class InterfaceRestrict<T> where T : IComparable
{
}
而T後面跟的是泛型約束,這個案例的意思是,代入的類T必須是實現了IComparable接口的類
以下來介紹泛型約束中where 的用法
接口約束
/// <summary>
/// 接口約束
/// </summary>
/// <typeparam name="T"></typeparam>
public class InterfaceRestrict<T> where T : IComparable
{
}
接口約束:限定代入的參數,必須是實現了某個接口(本代碼是指IComparable)的類,否則報錯
實現IComparable接口的類
/// <summary>
/// 實現IComparable接口的類
/// </summary>
public class ComparableClass : IComparable
{
public int CompareTo(object obj)
{
throw new NotImplementedException();
}
}
調用代碼如下
//接口約束
var interfaceRestric = new InterfaceRestrict<ComparableClass>();
基類約束
class BaseClassRestric<T> where T : struct
{
}
基類約束:限定代入的參數T,必須是某種基類型的數據,否則報錯.
上述代碼是限制了帶入的參數必須要struct類型的數據(此處到現在可以這麼理解)
結構體
/// <summary>
/// 測試結構體
/// </summary>
struct TestStruct
{
}
調用代碼如下
//基類約束
var baseClassRestrict = new BaseClassRestric<TestStruct>();
值得一提的是,基類約束中:
如果約束類別爲class,則可以看作是約束引用類型,所以帶入的參數可以是任何類、接口、委託或數組類型.(因爲這些參數,都是類)
如果約束類別爲struct,則可以看作是約束值類型,所以帶入的參數可以是任何簡單值類型(int,byte),DateTime,Enum
具體可看夢的介紹
構造函數約束
/// <summary>
/// 函數約束,說明T函數必須要有一個無參的構造函數
/// </summary>
/// <typeparam name="T"></typeparam>
class FunctionRestrict<T> where T : new()
{
}
基類約束:限定代入的參數T,必須是有一個無參的構造函數,否則報錯
/// <summary>
/// 有參構造類
/// </summary>
class HaveParaConstruClass
{
public HaveParaConstruClass(string str)
{
}
}
/// <summary>
/// 無參構造類
/// </summary>
class NonParaConstruClass
{
public NonParaConstruClass()
{
}
}
調用
//構造函數約束
//帶入有參構造類,會報錯
// var functionRestrict = new FunctionRestrict<HaveParaConstruClass>();
var functionRestrict = new FunctionRestrict<NonParaConstruClass>();
多類型約束
class MultiTypeRestrict<T, U> where T : class
where U : struct
{
}
多類型約束:所謂多類型約束,其實就是泛型約束中,有多個約束參數,在使用中,只要用where連接即可
PS:泛型約束在C#源碼中非常常見,還是有必要去學會基本使用的.
本文章借鑑
C# where用法