C#泛型約束6種使用方法

c# where泛型約束:在定義泛型的時候,我們可以使用where限制參數的範圍
共有六種類型的約束:
1:T:類(類型參數必須是引用類型,這一點也適用於任何類,接口,委託或數組類型)
class MyClass<T,U>
    where T:class //約束T必須爲“引用 類型{}”
    where U:struct //約束U必須爲“值 類型”
    {
        //...
    }
2:T:結構(類型參數必須是值類型,可以指定除Nullable以外的任何值類型)
class MyClass<T,U>
    where T:class //約束T必須爲“引用 類型{}“
    where U:struct //約束U必須爲“值類型”
3:T:new()(類型參數必須具有無參數的公共構造函數。當與其它一起使用時,new()約束必須最後指定
class EmployeeList<T> where T:Employee,IEmployee,System.IComparable<T>,new()
{...}
4:T:<基類名>(類型參數必須是指定的基類或派生自指定的基類)
class Employee()
class GenericList<T> where T:Employee
5:T:<接口名稱>(參數必須是指定的接口或實現指定的接口。可以指定多個接口約束。約束接口也可以是泛型)
interface IMyInterface{}
class Dictionary<TKey,TVal>
    where TKey:IComparable,IEnumerable
    where TVal:IMyInterface
    {...}
6:T:U(爲T提供的類型參數必須是爲U提供的參數或派生爲U提供的參數,也就是說T和U的參數必須一樣)
class List<T>
{
    void Add<U>(List<U> items) where U:T //這種where U:T泛型約束方式以前還沒有看到,此處的要求就是說泛型參數U必須來自T或派生自T類型
}        
a)可用於類
public class MyGenericClass<T> where T:IComparable{}//T必須是IComparable接口類型或接口的實現類
b)可用於方法
public boo MyMethod<T>(T t) where T:IMyInterface{}//T類型必須是IMyInterace接口類型或其實現類
c)可用於委託
public delegate T MyDelegate<T>() where T:new()//T類型必須具有無參數的公共構造函數,當new()與其它約束一起使用時,必須要放在最後
public delegate void MyDelegate<T>(T args) where T:IComparer,new()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章