c# where(泛型型別約束)
阿新 • • 發佈:2021-12-10
定義:在定義泛型的時候,我們可以使用where限制引數的範圍。
使用:在使用泛型的時候,你必須尊守where限制引數的範圍,否則編譯不會通過。
六種型別的約束:
T:類(型別引數必須是引用型別;這一點也適用於任何類、介面、委託或陣列型別。)
class MyClass<T, U> where T : class///約束T引數必須為“引用 型別{ }” where U : struct///約束U引數必須為“值 型別” { }
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 class GenericList<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()一份耕耘,一份收穫,付出就有回報永不遭遇過失敗,因我所碰到的都是暫時的挫折