2014-02-14 48 views
1
interface<T> where T : class 

例如接口<T>其中T:類

public interface iSend<T> where T : class 

是什麼上面的代碼是什麼意思?

爲什麼要使用它?

何時使用?

+2

你應該閱讀關於c#中的泛型而不是質疑它。這裏是關於MSDN的文章http://msdn.microsoft.com/en-us/library/512aeb7t.aspx – Sarrus

+1

另請參閱:[在C#中,代表什麼](http://stackoverflow.com/questions/9857180/what -does-t -in-in-c-sharp) – Theraot

回答

4

檢查我的全文後在這裏:Constrain on custom generic type探討不同類型的通用約束的

參考類型約束

約束確保類型參數是引用類型。即類,接口,代表,陣列等等

interface iSend<T> where T : class 

Valid    InValid 
A<MyClass>  A<int> 
A<InterfaceME> A<float> 
A<float[]> 

注: 總是首先施加多個約束時。

5

docs

約束類型參數

當你定義一個泛型類,你可以申請限制應用到各種客戶端代碼可以使用類型的參數,它的類型實例化你的類。如果客戶端代碼嘗試使用約束不允許的類型實例化您的類,則結果是編譯時錯誤。這些限制稱爲約束。
...
where T : class:type參數必須是引用類型;這也適用於任何類,接口,委託或數組類型。

如果使用此約束,那麼T必須是引用類型(並且沒有值類型)。

你這樣做,例如能夠使用null,因爲引用類型可以是null,而值類型不能。

2

有被稱爲泛型類型的約束。

上面的代碼意味着,你有一個通用接口iSend並且只需要一個引用類型的類型參數

當你想限制類型參數iSend是引用類型

+0

爲什麼要使用它?以及何時使用此? –

+1

@MARKANDBhatt我沒有適用於接口的示例,有些情況下,您可能想約束到引用類型:當您依賴於ReferenceEquals,使用弱引用時,或者當您想要執行一個原子讀取或寫入複雜類型。它也可能是一個簡短的說,泛型類型的變量應該能夠爲空。 – Theraot

相關問題