泛型型別引數的約束

2021-05-24 13:57:26 字數 1101 閱讀 1128

泛型型別引數的約束

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

約束 說明 t:結構

型別引數必須是值型別。可以指定除 nullable

以外的任何值型別。有關更多資訊,請參見使用可空型別(c# 程式設計指南)

。t:類

型別引數必須是引用型別,包括任何類、介面、委託或陣列型別。

t:new()

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

t:《基類名》

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

t:《介面名稱》

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

t:u為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。這稱為裸型別約束。

用作約束的泛型型別引數稱為裸型別約束。當具有自己的型別引數的成員函式需要將該引數約束為包含型別的型別引數時,裸型別約束很有用,如下面的示例所示:

list

<

t>

在上面的示例中,t 在add方法的上下文中是乙個裸型別約束,而在list類的上下文中是乙個未繫結的型別引數。

裸型別約束還可以在泛型類定義中使用。注意,還必須已經和其他任何型別引數一起在尖括號中宣告了裸型別約束:

//naked type constraint

public

class sampleclasswhere t : v

泛型類的裸型別約束的作用非常有限,因為編譯器除了假設某個裸型別約束派生自system.object以外,不會做其他任何假設。在希望強制兩個型別引數之間的繼承關係的情況下,可對泛型類使用裸型別約束。

泛型介紹(c# 程式設計指南)

中)的功能。

泛型型別的引數約束

t 結構 型別引數必須是值型別。可以指定除 nullable 以外的任何值型別。t 類 型別引數必須是引用型別 這一點也適用於任何類 介面 委託或陣列型別。t new 型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時,new 約束必須最後指定。t 基類名 型別引數必須是指定的基類或派生自...

泛型型別引數及約束

泛型型別引數簡介 在定義泛型型別和泛型方法時,常用到泛型型別引數,泛型型別引數是在例項化泛型時指定型別的佔位符。泛型型別引數放在 內。泛型型別引數命名建議 1 當泛型型別引數為單個字母時,建議用t表示。1 當泛型型別引數用單詞定義時,建議在單詞前加t。private void promptname ...

泛型型別引數及約束

在定義泛型型別和泛型方法時,常用到泛型型別引數,泛型型別引數是在例項化泛型時指定型別的佔位符。泛型型別引數放在 內。泛型型別引數命名建議 1 當泛型型別引數為單個字母時,建議用t表示。1 當泛型型別引數用單詞定義時,建議在單詞前加t。private void promptname t t priva...