溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是C#泛型的類型參數約束

發布時間:2020-07-31 09:04:55 來源:億速云 閱讀:317 作者:小豬 欄目:開發技術

這篇文章主要講解了什么是C#泛型的類型參數約束,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

常用約束

約束告知編譯器類型參數必須具備的功能。 在沒有任何約束的情況下,類型參數可以是任何類型。 編譯器只能假定 System.Object 的成員,它是任何 .NET 類型的最終基類。 如果客戶端代碼使用不滿足約束的類型,編譯器將發出錯誤。 通過使用 where 上下文關鍵字指定約束。 下表列出了七種類型的約束:

約束描述
where T : struct類型參數必須是不可為 null 的值類型。 有關可為 null 的值類型的信息,請參閱可為 null 的值類型。 由于所有值類型都具有可訪問的無參數構造函數,因此 struct 約束表示 new() 約束,并且不能與 new() 約束結合使用。 struct 約束也不能與 unmanaged 約束結合使用。
where T : class類型參數必須是引用類型。此約束還應用于任何類、接口、委托或數組類型。 在 C#8.0 或更高版本中的可為 null 上下文中,T 必須是不可為 null 的引用類型。
where T : class?類型參數必須是可為 null 或不可為 null 的引用類型。 此約束還應用于任何類、接口、委托或數組類型。
where T : notnull類型參數必須是不可為 null 的類型。 參數可以是 C# 8.0 或更高版本中的不可為 null 的引用類型,也可以是不可為 null 的值類型。
where T : unmanaged類型參數必須是不可為 null 的非托管類型。unmanaged 約束表示 struct 約束,且不能與 struct 約束或 new() 約束結合使用。
where T : new()類型參數必須具有公共無參數構造函數。與其他約束一起使用時,new() 約束必須最后指定。 new() 約束不能與 struct 和 unmanaged 約束結合使用。
where T : <base class name>類型參數必須是指定的基類或派生自指定的基類。 在 C# 8.0 及更高版本中的可為 null 上下文中,T 必須是從指定基類派生的不可為 null 的引用類型。
where T : <base class name>&#63;類型參數必須是指定的基類或派生自指定的基類。在 C# 8.0 及更高版本中的可為 null 上下文中,T 可以是從指定基類派生的可為 null 或不可為 null 的類型。
where T : <interface name>類型參數必須是指定的接口或實現指定的接口??芍付ǘ鄠€接口約束。 約束接口也可以是泛型。在 C# 8.0 及更高版本中的可為 null 上下文中,T 必須是實現指定接口的不可為 null 的類型。
where T : <interface name>&#63;類型參數必須是指定的接口或實現指定的接口??芍付ǘ鄠€接口約束。約束接口也可以是泛型。在 C# 8.0 中的可為 null 上下文中,T 可以是可為 null 的引用類型、不可為 null 的引用類型或值類型。T 不能是可為 null 的值類型。
where T : U為 T 提供的類型參數必須是為 U 提供的參數或派生自為 U 提供的參數。在可為 null 的上下文中,如果 U 是不可為 null 的引用類型,T 必須是不可為 null 的引用類型。如果 U 是可為 null 的引用類型,則 T 可以是可為 null 的引用類型,也可以是不可為 null 的引用類型。

最常用的泛型約束為where T : struct、where T : class、where T : new()。

約束多個參數

可以對多個參數應用多個約束,對一個參數應用多個約束,如下例所示:

class Base { }
class Test<T, U>
  where U : struct
  where T : Base, new()
{ }

對類型參數使用 == 和 != 運算符

在應用 where T : class 約束時,請避免對類型參數使用 == 和 != 運算符。編譯器只知道 T 在編譯時是引用類型,并且必須使用對所有引用類型都有效的默認運算符。

如果必須測試值相等性,建議同時應用 where T : IEquatable 或 where T : IComparable 約束,并在用于構造泛型類的任何類中實現該接口。

看完上述內容,是不是對什么是C#泛型的類型參數約束有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女