C where用法解析

2021-09-09 06:49:09 字數 1265 閱讀 8855

where 子句用於指定型別約束,這些約束可以作為泛型宣告中定義的型別引數的變數。

1.介面約束。

例如,可以宣告乙個泛型類 mygenericclass,這樣,型別引數 t 就可以實現 icomparable介面:

public class mygenericclasswhere t:icomparable

2.基類約束:指出某個型別必須將指定的類作為基類(或者就是該類本身),才能用作該泛型型別的型別引數。

這樣的約束一經使用,就必須出現在該型別引數的所有其他約束之前。

class myclassy

where t : class

where u : struct

3.where 子句還可以包括建構函式約束。

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

public class mygenericclass where t: icomparable, new()

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

4.對於多個型別引數,每個型別引數都使用乙個 where 子句,

例如:inte***ce myi

class dictionary

where tkey: icomparable, ienumerable

where tval: myi

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

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

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

delegate t mydelegate() where t : new()

泛型的where

泛型的where能夠對型別引數作出限定。有以下幾種方式。

·where t : struct 限制型別引數t必須繼承自system.valuetype。

·where t : class 限制型別引數t必須是引用型別,也就是不能繼承自system.valuetype。

·where t : new() 限制型別引數t必須有乙個預設的建構函式

·where t : nameofclass 限制型別引數t必須繼承自某個類或實現某個介面。

以上這些限定可以組合使用,比如: public class point where t : class, icomparable, new()

C where泛型約束

最近無意中看到了 但是,人笨啊,木有看懂到底是啥意思,木辦法自己寫乙個試試吧,權當做個筆記 例子如下 介面 using system using system.collections.generic using system.linq using system.text namespace wher...

C where泛型約束

最近無意中看到了 但是,人笨啊,木有看懂到底是啥意思,木辦法自己寫乙個試試吧,權當做個筆記 例子如下 介面 using system using system.collections.generic using system.linq using system.text namespace wher...

srand time NULL 用法解析

在一些產品的源 中,經常會發現有這樣的語句,srand unsigned time null 為什麼要這樣做呢,其實很簡單。1.time 函式表示返回1970 1 1 00 00 00 到當前時間的秒數,而time null 表示獲取乙個時間,準確的說,獲取乙個指標的位址。2.srand 函式是產生...