En c #, ¿qué significa 'where T: class'?

135

En C #, ¿qué where T : classsignifica?

Es decir.

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

Respuestas:

115

En pocas palabras, esto está restringiendo el parámetro genérico a una clase (o más específicamente un tipo de referencia que podría ser una clase, interfaz, delegado o tipo de matriz).

Vea este artículo de MSDN para más detalles.

Andy Rose
fuente
44
Te perdiste un caso. El argumento de tipo para T también puede ser cualquier otro parámetro de tipo que esté limitado a ser un tipo de referencia .
Eric Lippert
38

Es una restricción de tipo genérico . En este caso, significa que el tipo genérico Ttiene que ser un tipo de referencia (clase, interfaz, delegado o tipo de matriz).

Oded
fuente
35

Es una restricción de tipo T, que especifica que debe ser una clase.

La wherecláusula se puede usar para especificar otras restricciones de tipo, por ejemplo:

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 obtener más información, consulte la página de MSDN en la wherecláusula o las restricciones de parámetros genéricos .

Rosquilla
fuente
55
Es posible combinar estos juntos, por ejemplo:where T : class, IComparable, new()
Izzy
17

Eso se restringe Ta los tipos de referencia . No podrá poner tipos de valor ( structsy tipos primitivos excepto string) allí.

Vilx-
fuente
Esta respuesta (y otras dos con la misma información) fue más útil para mí que la seleccionada, porque da un ejemplo de lo que T no puede ser (me preguntaba qué esta restricción realmente agregó a la historia)
minutos
9

significa que el tipo utilizado como Tcuando se usa el método genérico debe ser una clase, es decir, no puede ser una estructura o un número incorporado como intodouble

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

where T: class literalmente significa eso T has to be a class. Puede ser cualquier tipo de referencia. Ahora, siempre que el código llama a su DoThis<T>()método debe proporcionar una clase para reemplazar T . Por ejemplo, si tuviera que llamar a su DoThis<T>()método, tendré que llamarlo de la siguiente manera:

DoThis<MyClass>();

Si su método es como el siguiente:

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

   // other uses of T as a type

}

Entonces, siempre que aparezca T en su método, será reemplazado por MyClass. Entonces, el método final que llama el compilador se verá así:

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
fuente
44
-1: new T()no es posible con where T : class. tienes que especificar where T: new()que se te permita hacerlo.
esskar
@explorer podemos definir un único método genérico y llamarlo desde múltiples lugares para insertar un registro pasando diferentes parámetros de diferentes lugares.
Zaker
4

T representa un tipo de objeto de, implica que puede dar cualquier tipo de. IList: si IList s = new IList; Ahora s.add ("Siempre aceptar cadena").

AsifQadri
fuente
2

Aquí T se refiere a una clase. Puede ser un tipo de referencia.

Hemant Kumar
fuente
1

'T' representa un tipo genérico. Significa que puede aceptar cualquier tipo de clase. El siguiente artículo podría ayudar:

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