在c#中,"T:class"是什么意思?

Mak*_*ach 125 c# syntax

在C#中where T : class意味着什么?

IE浏览器.

public IList<T> DoThis<T>() where T : class
Run Code Online (Sandbox Code Playgroud)

And*_*ose 107

简单地说,这是将泛型参数约束到一个类(或更具体地说,可以是类,接口,委托或数组类型的引用类型).

有关更多详细信息,请参阅此MSDN文章.

  • 你错过了一个案子.T的类型参数也可以是*任何其他类型参数,它被约束为引用类型*. (3认同)

Ode*_*ded 37

它是泛型类型约束.在这种情况下,它意味着泛型类型T必须是引用类型(类,接口,委托或数组类型).


Don*_*nut 34

它是一个类型约束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
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看MSDN关于where子句的页面或通用参数约束.

  • 可以将它们组合在一起,例如:`where T:class,IComparable,new()` (5认同)

Vil*_*lx- 14

这限制T引用类型.您将无法在其中放置值类型(structs和基本类型除外string).


Isa*_*avo 9

这意味着使用T泛型方法时使用的类型必须是一个类 - 即它不能是结构或内置数字int或类似或double

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
Run Code Online (Sandbox Code Playgroud)


exp*_*rer 8

where T: class 字面意思是T has to be a class.它可以是任何引用类型.现在,只要有任何代码调用你的DoThis<T>()方法,它就必须提供一个替换T的类.例如,如果我打电话给你的DoThis<T>()方法,那么我将不得不称之为:

DoThis<MyClass>();
Run Code Online (Sandbox Code Playgroud)

如果您的方法如下所示:

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

   // other uses of T as a type

}
Run Code Online (Sandbox Code Playgroud)

然后在你的方法中出现T的地方,它将被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
 }
Run Code Online (Sandbox Code Playgroud)

  • -1:`new T()`是不可能的`where T:class`.你必须指定`where T:new()`被允许这样做. (4认同)