C# where用法

C# where用法

where 子句用于指定類型約束,這些約束可以作為泛型聲明中定義的類型參數(shù)的變量。
1.接口約束。
例如,可以聲明一個泛型類 MyGenericClass,這樣,類型參數(shù) T 就可以實現(xiàn) IComparable<T> 接口:

public class MyGenericClass<T> where T : IComparable { }

2.基類約束:指出某個類型必須將指定的類作為基類(或者就是該類本身),才能用作該泛型類型的類型參數(shù)。
這樣的約束一經(jīng)使用,就必須出現(xiàn)在該類型參數(shù)的所有其他約束之前。

class MyClassy<T, U>
where T : class
where U : struct
{
}

3.where 子句還可以包括構(gòu)造函數(shù)約束。
可以使用 new 運算符創(chuàng)建類型參數(shù)的實例;但類型參數(shù)為此必須受構(gòu)造函數(shù)約束 new() 的約束。new() 約束可以讓編譯器知道:提供的任何類型參數(shù)都必須具有可訪問的無參數(shù)(或默認)構(gòu)造函數(shù)。例如:

public class MyGenericClass<T> where T : IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}

new() 約束出現(xiàn)在 where 子句的最后。

4.對于多個類型參數(shù),每個類型參數(shù)都使用一個 where 子句,
例如:

interface MyI { }
class Dictionary<TKey, TVal>
where TKey : IComparable, IEnumerable
where TVal : MyI
{
public void Add(TKey key, TVal val)
{
}
}

5.還可以將約束附加到泛型方法的類型參數(shù),例如:

public bool MyMethod<T>(T t) where T : IMyInterface { }

請注意,對于委托和方法兩者來說,描述類型參數(shù)約束的語法是一樣的:

delegate T MyDelegate<T>() where T : new()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,635評論 19 139
  • { "Unterminated string literal.": "未終止的字符串文本。", "Identifi...
    一粒沙隨風(fēng)飄搖閱讀 11,348評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,658評論 0 4
  • 在以前頁面布局多依賴于table,但table標(biāo)簽太多,于是有了absolute布局,float布局等,但它們小問...
    張歆琳閱讀 4,445評論 3 55

友情鏈接更多精彩內(nèi)容