2010-09-24 73 views

回答

83

簡單地講,這是約束通用參數傳遞給一個類(或者更具體地說是一個可以是類,接口,委託或數組類型的引用類型)。

有關詳細信息,請參閱此MSDN article

+2

您錯過了一個案例。 T的類型參數也可以是任何其他被約束爲引用類型的類型參數。 – 2010-09-24 15:23:25

+0

Upvoted爲所提供的MSDN鏈接。它非常有用 – SaddamBinSyed 2017-09-13 08:32:07

1

'T'表示泛型類型。這意味着它可以接受任何類型的課程。以下文章可能有所幫助:

http://www.15seconds.com/issue/031024.htm 
34

這是一個generic type constraint。在這種情況下,這意味着泛型T必須是引用類型(類,接口,委託或數組類型)。

8

這意味着所使用的類型如T時的一般方法,使用必須是類 - 即,它不能是一個結構或內置在數字像intdouble

// Valid: 
var myStringList = DoThis<string>(); 
// Invalid - compile error 
var myIntList = DoThis<int>(); 
28

這是一個類型約束T,指定它必須是一個類。

where子句可用於指定其他類型的限制,例如:

where T : struct // T must be a struct 
where T : new() // T must have a default parameterless constructor 
where T : IComparable // T must implement the IComparable interface 

欲瞭解更多信息,請查看MSDN頁面上的where clause,或generic parameter constraints

+3

可以將它們組合在一起,例如:'where T:class,IComparable,new()' – Izzy 2016-03-10 09:49:44

13

這限制了T參考類型。您將無法將值類型(struct s和基本類型除string)放在那裏。

4

T代表的對象類型,它意味着你可以給任何類型的。 IList:如果IList =新IList; 現在s.add(「總是接受字符串。」)。

5

where T: class的原意是指T has to be a class。它可以是任何參考類型。現在,只要有任何代碼調用您的DoThis<T>()方法,它必須提供一個類來取代T。例如,如果我是叫你DoThis<T>()方法那麼我將不得不調用它像以下:

DoThis<MyClass>(); 

如果您metthod就像是這樣的:

public IList<T> DoThis<T>() where T : class 
{ 
    T variablename = new T(); 

    // other uses of T as a type 

} 

然後在以往任何時候牛逼出現在方法,它將被MyClass取代。這樣編譯器調用,將類似於下面的最後一個方法:

public IList<MyClass> DoThis<MyClass>() 
{ 
    MyClass variablename= new MyClass(); 

    //other uses of MyClass as a type 

    // all occurences of T will similarly be replace by MyClass 
} 
+3

-1:'new T()'不可能和'where T:class'一起使用。你必須指定'where T:new()'來允許它做。 – esskar 2013-01-22 18:02:39

+0

@explorer我們可以定義一個單一的泛型方法,並從多個地方調用它來通過從不同地方傳入不同參數來插入記錄。 – User 2015-06-18 06:47:48

2

這裏t代表一個Class.It可以是引用類型。