where(泛型類型約束)
阿新 • • 發佈:2017-06-29
sof mic spa 可用 ace num 字典 構造函數 com
定義:在定義泛型的時候,我們可以使用 where 限制參數的範圍。
使用:在使用泛型的時候,你必須尊守 where 限制參數的範圍,否則編譯不會通過。
// .NET支持的類型參數約束 : //where T : struct | T必須是一個結構類型 //where T : class | T必須是一個Class類型 //where T : new() | T必須要有一個無參構造函數 //where T : NameOfBaseClass | T必須繼承名為NameOfBaseClass的類 //where T : NameOfInterface | T必須實現名為NameOfInterface的接口
六種類型的約束:
T:類(類型參數必須是引用類型;這一點也適用於任何類、接口、委托或數組類型。)
1 class MyClass<T, U> 2 where T : class///約束T參數必須為“引用 類型{ }” 3 where U : struct///約束U參數必須為“值 類型” 4 { }
T:結構(類型參數必須是值類型。可以指定除 Nullable 以外的任何值類型。)
class MyClass<T, U> where T : class///約束T參數必須為“引用 類型{ }”where U : struct///約束U參數必須為“值 類型” { }
T:new()(類型參數必須具有無參數的公共構造函數。當與其他約束一起使用時,new() 約束必須最後指定。)
class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new() { // ... }
T:<基類名>(類型參數必須是指定的基類或派生自指定的基類。)
public class Employee{} public classGenericList<T> where T : Employee
T:<接口名稱>(類型參數必須是指定的接口或實現指定的接口。可以指定多個接口約束。約束接口也可以是泛型的。)
/// <summary> /// 接口 /// </summary> interface IMyInterface { } /// <summary> /// 定義的一個字典類型 /// </summary> /// <typeparam name="TKey"></typeparam> /// <typeparam name="TVal"></typeparam> class Dictionary<TKey, TVal> where TKey : IComparable, IEnumerable where TVal : IMyInterface { public void Add(TKey key, TVal val) { } }
T:U(為 T 提供的類型參數必須是為 U 提供的參數或派生自為 U 提供的參數。也就是說T和U的參數必須一樣)
class List<T> { void Add<U>(List<U> items) where U : T {/*...*/} }
可用於類、方法、委托
public class MyGenericClass<T> where T:IComparable { } public bool MyMethod<T>(T t) where T : IMyInterface { } delegate T MyDelegate<T>() where T : new()
當只希望傳過來的泛型參數是限定範圍的,需要用到 WHERE 來限定
比如希望是值類型,或者是引用類型,或者是繼承至某個類型、或者是符合某個接扣的類型,
參考文檔:
https://msdn.microsoft.com/zh-cn/library/d5x73970.aspx
https://msdn.microsoft.com/zh-cn/library/bb384067.aspx
where(泛型類型約束)