詳解C#泛型的類型參數(shù)約束
常用約束
約束告知編譯器類型參數(shù)必須具備的功能。 在沒有任何約束的情況下,類型參數(shù)可以是任何類型。 編譯器只能假定 System.Object 的成員,它是任何 .NET 類型的最終基類。 如果客戶端代碼使用不滿足約束的類型,編譯器將發(fā)出錯(cuò)誤。 通過使用 where 上下文關(guān)鍵字指定約束。 下表列出了七種類型的約束:
| 約束 | 描述 |
| where T : struct | 類型參數(shù)必須是不可為 null 的值類型。 有關(guān)可為 null 的值類型的信息,請(qǐng)參閱可為 null 的值類型。 由于所有值類型都具有可訪問的無(wú)參數(shù)構(gòu)造函數(shù),因此 struct 約束表示 new() 約束,并且不能與 new() 約束結(jié)合使用。 struct 約束也不能與 unmanaged 約束結(jié)合使用。 |
| where T : class | 類型參數(shù)必須是引用類型。此約束還應(yīng)用于任何類、接口、委托或數(shù)組類型。 在 C#8.0 或更高版本中的可為 null 上下文中,T 必須是不可為 null 的引用類型。 |
| where T : class? | 類型參數(shù)必須是可為 null 或不可為 null 的引用類型。 此約束還應(yīng)用于任何類、接口、委托或數(shù)組類型。 |
| where T : notnull | 類型參數(shù)必須是不可為 null 的類型。 參數(shù)可以是 C# 8.0 或更高版本中的不可為 null 的引用類型,也可以是不可為 null 的值類型。 |
| where T : unmanaged | 類型參數(shù)必須是不可為 null 的非托管類型。unmanaged 約束表示 struct 約束,且不能與 struct 約束或 new() 約束結(jié)合使用。 |
| where T : new() | 類型參數(shù)必須具有公共無(wú)參數(shù)構(gòu)造函數(shù)。與其他約束一起使用時(shí),new() 約束必須最后指定。 new() 約束不能與 struct 和 unmanaged 約束結(jié)合使用。 |
| where T : <base class name> | 類型參數(shù)必須是指定的基類或派生自指定的基類。 在 C# 8.0 及更高版本中的可為 null 上下文中,T 必須是從指定基類派生的不可為 null 的引用類型。 |
| where T : <base class name>? | 類型參數(shù)必須是指定的基類或派生自指定的基類。在 C# 8.0 及更高版本中的可為 null 上下文中,T 可以是從指定基類派生的可為 null 或不可為 null 的類型。 |
| where T : <interface name> | 類型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口??芍付ǘ鄠€(gè)接口約束。 約束接口也可以是泛型。在 C# 8.0 及更高版本中的可為 null 上下文中,T 必須是實(shí)現(xiàn)指定接口的不可為 null 的類型。 |
| where T : <interface name>? | 類型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口??芍付ǘ鄠€(gè)接口約束。約束接口也可以是泛型。在 C# 8.0 中的可為 null 上下文中,T 可以是可為 null 的引用類型、不可為 null 的引用類型或值類型。T 不能是可為 null 的值類型。 |
| where T : U | 為 T 提供的類型參數(shù)必須是為 U 提供的參數(shù)或派生自為 U 提供的參數(shù)。在可為 null 的上下文中,如果 U 是不可為 null 的引用類型,T 必須是不可為 null 的引用類型。如果 U 是可為 null 的引用類型,則 T 可以是可為 null 的引用類型,也可以是不可為 null 的引用類型。 |
最常用的泛型約束為where T : struct、where T : class、where T : new()。
約束多個(gè)參數(shù)
可以對(duì)多個(gè)參數(shù)應(yīng)用多個(gè)約束,對(duì)一個(gè)參數(shù)應(yīng)用多個(gè)約束,如下例所示:
class Base { }
class Test<T, U>
where U : struct
where T : Base, new()
{ }
對(duì)類型參數(shù)使用 == 和 != 運(yùn)算符
在應(yīng)用 where T : class 約束時(shí),請(qǐng)避免對(duì)類型參數(shù)使用 == 和 != 運(yùn)算符。編譯器只知道 T 在編譯時(shí)是引用類型,并且必須使用對(duì)所有引用類型都有效的默認(rèn)運(yùn)算符。
如果必須測(cè)試值相等性,建議同時(shí)應(yīng)用 where T : IEquatable 或 where T : IComparable 約束,并在用于構(gòu)造泛型類的任何類中實(shí)現(xiàn)該接口。
參考文章
類型參數(shù)的約束(C# 編程指南)——Microsoft
以上就是詳解C#泛型的類型參數(shù)約束的詳細(xì)內(nèi)容,更多關(guān)于C#泛型的類型參數(shù)約束的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用Mutex簡(jiǎn)單實(shí)現(xiàn)程序單實(shí)例運(yùn)行的方法
這篇文章主要介紹了C#使用Mutex簡(jiǎn)單實(shí)現(xiàn)程序單實(shí)例運(yùn)行的方法,涉及C#實(shí)現(xiàn)單實(shí)例程序運(yùn)行的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
C#檢查Windows是否安裝了某個(gè)服務(wù)的方法
這篇文章主要介紹了C#檢查Windows是否安裝了某個(gè)服務(wù)的方法,涉及C#操作windows系統(tǒng)服務(wù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
C#中DataGridView導(dǎo)出Excel的兩種方法
這篇文章主要介紹了C#中DataGridView導(dǎo)出Excel的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
C#使用對(duì)象序列化類庫(kù)MessasgePack
這篇文章介紹了C#使用對(duì)象序列化類庫(kù)MessasgePack的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

