在定義泛型類時,可以對客戶端**能夠在例項化類時用於型別引數的型別種類施加限制。
如果客戶端**嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。
這些限制稱為約束。
約束是使用 where 上下文關鍵字指定的。
下表列出了六種型別的約束:
約束 說明
t:結構
型別引數必須是值型別。
可以指定除 nullable 以外的任何值型別。
有關更多資訊,請參見使用可以為 null 的型別(c# 程式設計指南)。
t:類型別引數必須是引用型別;這一點也適用於任何類、介面、委託或陣列型別。
t:new()
型別引數必須具有無引數的公共建構函式。
當與其他約束一起使用時,new() 約束必須最後指定。
t:《基類名》
型別引數必須是指定的基類或派生自指定的基類。
t:《介面名稱》
型別引數必須是指定的介面或實現指定的介面。
可以指定多個介面約束。
約束介面也可以是泛型的。
t:u為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。
使用約束的原因
如果要檢查泛型列表中的某個項以確定它是否有效,或者將它與其他某個項進行比較,則編譯器必須在一定程度上保證它需要呼叫的運算子或方法將受到客戶端**可能指定的任何型別引數的支援。
這種保證是通過對泛型類定義應用乙個或多個約束獲得的。
例如,基類約束告訴編譯器:僅此型別的物件或從此型別派生的物件才可用作型別引數。
一旦編譯器有了這個保證,它就能夠允許在泛型類中呼叫該型別的方法。
約束是使用上下文關鍵字 where 應用的。
下面的**示例演示可通過應用基類約束新增到 genericlist 類(在泛型介紹(c# 程式設計指南)中)的功能。
以上原文:
下面是對陣列的基類進行擴充套件,擴充套件的方法是乙個泛型方法 databox 是乙個泛型,而 where 關鍵字約束了這個databox 泛型只能是databoxbase型別或他的子型別,並且之後的約束中告訴編譯器可以使用new()方法構建這個泛型物件
using system;
namespace mpgnetpublicdll
}} }}
}
再看乙個簡單一點的經典的例子:
public class aaa
public virtual t copy() where t :aaa, new() //泛型約束。約束中不能給定多個類
}public class bbb :aaa
public override t copy()
}
泛型 泛型類 泛型方法 泛型擦除
1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...
泛型類,泛型方法,泛型介面
泛型,就是一種不確定的資料型別。如果在類後面加上 這個類就變成了泛型類。這個 t可以使用任意的字母代替。表示定義了一種不確定的資料型別,這種不確定的資料型別必須在使用這個類 比如建立物件 的時候才能確定下來。如果希望縮小泛型的範圍,延後泛型的確定時間,讓泛型在呼叫方法的時候確定,那麼我們可以使用泛型...
泛型討論 泛型方法
泛型不經可以用在整個類上,同樣也可以用在雷中包含引數化的方法,而這個方法所在的類可以是泛型,也可以不是泛型,也就是說,是否擁有泛型方法,與其所在的類是否是泛型沒有關係。乙個基本的原則,優先使用泛型方法,然後才是泛型類,另外對於static方法而言,無法訪問泛型類的型別引數,所以,如果static方法...