在C#中,“ where T:class”是什么意思?


135

在C#中是什么where T : class意思?

就是

public IList<T> DoThis<T>() where T : class

Answers:


115

简而言之,这是将通用参数限制为一个类(或更具体而言,可以是类,接口,委托或数组类型的引用类型)。

请参阅此MSDN文章以获取更多详细信息。


4
您错过了一个案例。T的类型参数也可以是被约束为引用类型的任何其他类型参数
埃里克·利珀特

38

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


35

这是对的类型约束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子句通用参数约束的页面。


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

17

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


这个答案(以及其他几个具有相同信息的答案)对我来说比选定的答案更有用,因为它给出了T不能为例(我想知道这个约束实际上对故事有什么影响)
分钟

9

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

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

8

where T: class 字面上的意思是T has to be a class。它可以是任何引用类型。现在,只要任何代码调用您的DoThis<T>()方法,它必须提供一个类来代替牛逼。例如,如果我要调用您的DoThis<T>()方法,则必须像下面这样调用它:

DoThis<MyClass>();

如果您的方法如下所示:

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

   // other uses of T as a type

}

然后在您的方法中出现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
 }

4
-1:new T()无法使用where T : class。您必须指定where T: new()允许这样做。
esskar

@explorer我们可以定义一个通用方法,并在多个位置调用它,以通过在不同位置传递不同的参数来插入一条记录。
Zaker




1

“ T”代表通用类型。这意味着它可以接受任何类型的类。以下文章可能会有所帮助:

http://www.15seconds.com/issue/031024.htm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.