C 泛型約束

2021-09-28 23:48:58 字數 1396 閱讀 3075

約束告知編譯器型別引數必須具備的功能。 在沒有任何約束的情況下,型別引數可以是任何型別。 編譯器只能假定 system.object 的成員,它是任何 .net 型別的最終基類。 有關詳細資訊,請參閱使用約束的原因。 如果客戶端**嘗試使用約束所不允許的型別來例項化類,則會產生編譯時錯誤。 通過使用where上下文關鍵字指定約束。 下表列出了七種型別的約束:

約束說明

where t : struct型別引數必須是值型別。 可以指定除 nullable 以外的任何值型別。 有關可為空的值型別的詳細資訊,請參閱可為空的值型別。

where t : class型別引數必須是引用型別。 此約束還應用於任何類、介面、委託或陣列型別。

where t : notnull型別引數必須是不可為 null 的型別。 引數可以是 c# 8.0 或更高版本中的不可為 null 的引用型別,也可以是不可為 null 的值型別。 此約束還應用於任何類、介面、委託或陣列型別。

where t : unmanaged型別引數必須是非託管型別。

where t : new()型別引數必須具有公共無引數建構函式。 與其他約束一起使用時,new()約束必須最後指定。

where t :《基類名》

型別引數必須是指定的基類或派生自指定的基類。

where t :《介面名稱》

型別引數必須是指定的介面或實現指定的介面。 可指定多個介面約束。 約束介面也可以是泛型。

where t : u為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。

某些約束是互斥的。 所有值型別必須具有可訪問的無引數建構函式。struct約束包含new()約束,且new()約束不能與struct約束結合使用。unmanaged約束包含struct約束。unmanaged約束不能與structnew()約束結合使用。

通過約束型別引數,可以增加約束型別及其繼承層次結構中的所有型別所支援的允許操作和方法呼叫的數量。 設計泛型類或方法時,如果要對泛型成員執行除簡單賦值之外的任何操作或呼叫 system.object 不支援的任何方法,則必須對該型別引數應用約束。 例如,基類約束告訴編譯器,僅此型別的物件或派生自此型別的物件可用作型別引數。 編譯器有了此保證後,就能夠允許在泛型類中呼叫該型別的方法。 以下**示例演示可通過應用基類約束新增到(泛型介紹中的)genericlist類的功能。

c 泛型約束

在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。下表列出了六種型別的約束 約束說明 t struct 型別引數必須是值型別。可以指定除...

C 泛型約束

一 泛型約束 預設情況下,泛型的型別引數可以是任何型別的。為什麼要使用型別引數的約束呢?簡單點說就是篩選型別引數,在使用泛型的 中如果違反了某個約束不允許的型別來例項化則會產生編譯錯誤,型別引數的約束是使用關鍵字where。下面列出了6中型別的約束 泛型約束有以下幾種 where t base cl...

C 泛型約束

范型中注意要用default返回預設值。范型約束where可以約束指定泛型型別是某種類或某種結構體,只能指定預設建構函式的約束不能指定其它形式的建構函式的約束,介面不能指定操作符過載。where t struct t是值型別 where t class t是引用型別 where t ifoo t必須...