2010-09-24 12 views

Respuesta

83

En pocas palabras esto restringe la 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 esto MSDN article para más detalles.

+2

Has perdido un caso. El argumento de tipo para T también puede ser * cualquier otro parámetro de tipo que esté restringido para ser un tipo de referencia *. –

+0

Upvoted para el enlace MSDN proporcionado. es muy útil – SaddamBinSyed

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 
34

Es un generic type constraint. En este caso, significa que el tipo genérico T tiene que ser un tipo de referencia (clase, interfaz, delegado o tipo de matriz).

8

que significa que el tipo utilizado como T cuando se utiliza el método genérico debe ser una clase - es decir, no puede ser una estructura o construido en igual número int o double

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

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

La cláusula where puede usarse 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, echa un vistazo a la página de MSDN en la where clause o generic parameter constraints.

+3

Es posible combinarlos juntos, por ejemplo: 'donde T: clase, IComparable, nuevo()' – Izzy

13

Que restringe T a tipos de referencia. No podrá colocar tipos de valores (struct sy tipos primitivos excepto string) allí.

4

T representa un tipo de objeto de, implica que se puede dar cualquier tipo de. IList: if IList s = new IList; Ahora s.add ("Aceptar siempre cadena").

5

where T: class significa literalmente que T has to be a class. Puede ser cualquier tipo de referencia. Ahora, cada vez que un código llame a su método DoThis<T>(), debe proporcionar una clase para reemplazar T.Por ejemplo, si yo fuera a llamar a su método de DoThis<T>() entonces voy a tener que llamar a él como siguiente:

DoThis<MyClass>(); 

Si su metthod es como el siguiente:

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

    // other uses of T as a type 

} 

Entonces donde quiera T aparece en su método, será reemplazado por MyClass. Por lo que el último método que las llamadas del compilador, se verá como la siguiente:

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 
} 
+3

-1: 'nuevo T()' no es posible con 'donde T: clase'. tienes que especificar 'donde T: new()' para poder hacerlo. – esskar

+0

@explorer podemos definir un único método genérico y llamarlo desde múltiples lugares para insertar un registro pasando diferentes parámetros desde diferentes lugares. – User

2

Aquí T se refiere a un Class.It puede ser un tipo de referencia.