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


135

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

Es decir.

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

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.


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


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 .


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


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

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
 }

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



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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.