MSDN 泛型中引數約束(where 關鍵字用法)

2021-08-22 12:20:32 字數 1403 閱讀 3818

where 子句用於指定型別約束,這些約束可以作為泛型宣告中定義的型別引數的變數。例如,可以宣告乙個泛型類mygenericclass,這樣,型別引數t就可以實現 icomparable介面:

複製**

public class mygenericclasswhere t:icomparable

除了介面約束,where 子句還可以包括基類約束,以指出某個型別必須將指定的類作為基類(或者就是該類本身),才能用作該泛型型別的型別引數。這樣的約束一經使用,就必須出現在該型別引數的所有其他約束之前。

複製**

// cs_where.cs

// compile with: /target:library

using system;

class myclassywhere t : class

where u : struct

where 子句還可以包括建構函式約束。可以使用 new 運算子建立型別引數的例項;但型別引數為此必須受建構函式約束 new() 的約束。new() 約束可以讓編譯器知道:提供的任何型別引數都必須具有可訪問的無引數(或缺省)建構函式。例如:

複製**

// cs_where_2.cs

// compile with: /target:library

using system;

public class mygenericclass where t: icomparable, new()

new() 約束出現在 where 子句的最後。

對於多個型別引數,每個型別引數都使用乙個 where 子句,例如:

複製**

// cs_where_3.cs

// compile with: /target:library

using system;

using system.collections;

inte***ce myi

class dictionarywhere tkey: icomparable, ienumerable

where tval: myi

}

還可以將約束附加到泛型方法的型別引數,例如:

複製**

public bool mymethod(t t) where t : imyinte***ce

請注意,對於委託和方法兩者來說,描述型別引數約束的語法是一樣的:

複製**

delegate t mydelegate() where t : new()

有關泛型委託的資訊,請參見泛型委託。

有關約束的語法和用法的詳細資訊,請參見型別引數的約束。

泛型型別引數的約束

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

泛型型別引數及約束

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

泛型型別引數及約束

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