C#泛型約束的深入理解
更新時(shí)間:2013年05月31日 11:32:16 作者:
本篇文章是對(duì)C#中的泛型約束進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
where 子句用于指定類型約束,這些約束可以作為泛型聲明中定義的類型參數(shù)的變量。
1.接口約束。
例如,可以聲明一個(gè)泛型類 MyGenericClass,這樣,類型參數(shù) T 就可以實(shí)現(xiàn) IComparable<T> 接口:
public class MyGenericClass<T> where T:IComparable { }
2.基類約束:指出某個(gè)類型必須將指定的類作為基類(或者就是該類本身),才能用作該泛型類型的類型參數(shù)。
這樣的約束一經(jīng)使用,就必須出現(xiàn)在該類型參數(shù)的所有其他約束之前。
class MyClassy<T, U>
where T : class
where U : struct
{
}
3.where 子句還可以包括構(gòu)造函數(shù)約束。
可以使用 new 運(yùn)算符創(chuàng)建類型參數(shù)的實(shí)例;但類型參數(shù)為此必須受構(gòu)造函數(shù)約束 new() 的約束。new() 約束可以讓編譯器知道:提供的任何類型參數(shù)都必須具有可訪問的無參數(shù)(或默認(rèn))構(gòu)造函數(shù)。例如:
public class MyGenericClass <T> where T: IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}
new() 約束出現(xiàn)在 where 子句的最后。
4.對(duì)于多個(gè)類型參數(shù),每個(gè)類型參數(shù)都使用一個(gè) where 子句
例如:
interface MyI { }
class Dictionary<TKey,TVal>
where TKey: IComparable, IEnumerable
where TVal: MyI
{
public void Add(TKey key, TVal val)
{
}
}
5.還可以將約束附加到泛型方法的類型參數(shù),例如:
public bool MyMethod<T>(T t) where T : IMyInterface { }
請(qǐng)注意,對(duì)于委托和方法兩者來說,描述類型參數(shù)約束的語法是一樣的:
delegate T MyDelegate<T>() where T : new()
1.接口約束。
例如,可以聲明一個(gè)泛型類 MyGenericClass,這樣,類型參數(shù) T 就可以實(shí)現(xiàn) IComparable<T> 接口:
復(fù)制代碼 代碼如下:
public class MyGenericClass<T> where T:IComparable { }
2.基類約束:指出某個(gè)類型必須將指定的類作為基類(或者就是該類本身),才能用作該泛型類型的類型參數(shù)。
這樣的約束一經(jīng)使用,就必須出現(xiàn)在該類型參數(shù)的所有其他約束之前。
復(fù)制代碼 代碼如下:
class MyClassy<T, U>
where T : class
where U : struct
{
}
3.where 子句還可以包括構(gòu)造函數(shù)約束。
可以使用 new 運(yùn)算符創(chuàng)建類型參數(shù)的實(shí)例;但類型參數(shù)為此必須受構(gòu)造函數(shù)約束 new() 的約束。new() 約束可以讓編譯器知道:提供的任何類型參數(shù)都必須具有可訪問的無參數(shù)(或默認(rèn))構(gòu)造函數(shù)。例如:
復(fù)制代碼 代碼如下:
public class MyGenericClass <T> where T: IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}
new() 約束出現(xiàn)在 where 子句的最后。
4.對(duì)于多個(gè)類型參數(shù),每個(gè)類型參數(shù)都使用一個(gè) where 子句
例如:
復(fù)制代碼 代碼如下:
interface MyI { }
class Dictionary<TKey,TVal>
where TKey: IComparable, IEnumerable
where TVal: MyI
{
public void Add(TKey key, TVal val)
{
}
}
5.還可以將約束附加到泛型方法的類型參數(shù),例如:
復(fù)制代碼 代碼如下:
public bool MyMethod<T>(T t) where T : IMyInterface { }
請(qǐng)注意,對(duì)于委托和方法兩者來說,描述類型參數(shù)約束的語法是一樣的:
復(fù)制代碼 代碼如下:
delegate T MyDelegate<T>() where T : new()
相關(guān)文章
C#實(shí)現(xiàn)數(shù)據(jù)去重的方式總結(jié)
這篇文章主要來和大家一起來討論一下關(guān)于C#數(shù)據(jù)去重的常見的幾種方式,每種方法都有其特點(diǎn)和適用場景,感興趣的小伙伴可以了解一下2023-07-07關(guān)于Flyweight模式應(yīng)用實(shí)踐的相關(guān)介紹
本篇文章,小編將為大家介紹Flyweight模式應(yīng)用實(shí)踐,有需要的朋友可以參考一下2013-04-04C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05