Em c #, o que significa 'where T: class'?

135

Em C #, o que where T : classsignifica?

Ou seja.

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

Respostas:

115

Simplificando, isso restringe o parâmetro genérico a uma classe (ou mais especificamente a um tipo de referência que pode ser um tipo de classe, interface, delegado ou matriz).

Consulte este artigo do MSDN para obter mais detalhes.

Andy Rose
fonte
4
Você perdeu um caso. O argumento de tipo para T também pode ser qualquer outro parâmetro de tipo restrito a ser um tipo de referência .
Eric Lippert
38

É uma restrição de tipo genérico . Nesse caso, significa que o tipo genérico Tdeve ser um tipo de referência (classe, interface, delegado ou tipo de matriz).

Oded
fonte
35

É uma restrição de tipo T, especificando que deve ser uma classe.

A wherecláusula pode ser usada para especificar outras restrições de tipo, por exemplo:

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

Para obter mais informações, consulte a página do MSDN na wherecláusula ou restrições genéricas de parâmetros .

Rosquinha
fonte
5
É possível combiná-los, por exemplo:where T : class, IComparable, new()
Izzy
17

Isso restringe Ta tipos de referência . Você não poderá colocar tipos de valor (se structprimitivos, exceto string) lá.

Vilx-
fonte
Essa resposta (e algumas outras com a mesma informação) foi mais útil para mim do que a selecionada, porque fornece um exemplo do que T não pode ser (eu queria saber o que essa restrição realmente acrescentou à história)
minutos
9

significa que o tipo usado como Tquando o método genérico é usado deve ser uma classe - ou seja, não pode ser uma estrutura ou um número incorporado como intoudouble

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

where T: class literalmente significa isso T has to be a class. Pode ser qualquer tipo de referência. Agora sempre que algum código chama o DoThis<T>()método que deve fornecer uma classe para substituir T . Por exemplo, se eu chamar seu DoThis<T>()método, terei que chamá-lo da seguinte maneira:

DoThis<MyClass>();

Se o seu método for semelhante ao seguinte:

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

   // other uses of T as a type

}

Então, sempre que T aparecer no seu método, ele será substituído pelo MyClass. Portanto, o método final que o compilador chama terá a seguinte aparência:

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
 }
explorador
fonte
4
-1: new T()não é possível com where T : class. você precisa especificar where T: new()para poder fazê-lo.
esskar
@explorer podemos definir um método genérico único e chamá-lo de vários locais para inserir um registro passando parâmetros diferentes de diferentes locais.
Zaker
4

T representa um tipo de objeto, implica que você pode fornecer qualquer tipo de. IList: se IList s = new IList; Agora s.add ("Sempre aceite string.").

AsifQadri
fonte
2

Aqui, T refere-se a uma classe e pode ser um tipo de referência.

Hemant Kumar
fonte
1

'T' representa um tipo genérico. Isso significa que ele pode aceitar qualquer tipo de classe. O seguinte artigo pode ajudar:

http://www.15seconds.com/issue/031024.htm
Randy Minder
fonte