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

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.


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


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 .


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á.


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>();

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
 }

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.").



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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.