2009-03-07 33 views
11

¿Qué significa where T : somevalue? Acabo de ver un código que decía where T : Attribute. Creo que esto tiene algo que ver con los genéricos, pero no estoy seguro de lo que esto significa o lo que está haciendo.¿Qué significa "donde T: algún valor" significa?

¿Alguien sabe?

Respuesta

28

Es un constraint on a type parameter, lo que significa que el tipo T dado a una clase genérica o método debe heredar de la clase Attribute

Por ejemplo:

public class Foo<T> : 
    where T : Attribute 
{ 
    public string GetTypeId(T attr) { return attr.TypeId.ToString(); } 
// .. 
} 

Foo<DescriptionAttribute> bar; // OK, DescriptionAttribute inherits Attribute 
Foo<int> baz; // Compiler error, int does not inherit Attribute 

Esto es útil, ya que permite al genérico clase para hacer cosas con objetos de tipo T sabiendo que todo lo que sea T también debe ser Attribute.

En el ejemplo anterior, está bien que GetTypeId para consultar el TypeId de attr porque TypeId es una propiedad de un Attribute, y debido a attr es una T Debe ser un tipo que hereda de Attribute.

Las restricciones también se pueden utilizar en los métodos genéricos, con el mismo efecto:

public static void GetTypeId<T>(T attr) where T : Attribute 
{ 
    return attr.TypeId.ToString(); 
} 

Hay otras limitaciones se pueden colocar en un tipo; de MSDN:

where T: struct

El argumento tipo debe ser un valor tipo. Se puede especificar cualquier tipo de valor excepto Nullable .

where T : class

El argumento tipo debe ser una referencia tipo; esto se aplica también a cualquier clase, interfaz, delegado o tipo de matriz.

where T : new()

El argumento tipo debe tener un constructor sin parámetros pública. Cuando se utiliza junto con otras limitaciones, el nuevo) restricción (se debe especificar pasado.

where T : <base class name>

El argumento tipo debe ser o derivar de la clase base especificado.

where T : <interface name>

El argumento tipo debe ser o implementar la interfaz especificada. Múltiples restricciones de interfaz pueden ser especificadas. La interfaz restrictiva también puede ser genérica.

where T : U

El argumento tipo suministrado para T debe ser o derivar a partir del argumento suministrado para U. Esto se llama un desnudo tipo de restricción.

+0

+1 Esto es bastante compresivo. Ojalá pueda preferir una respuesta. – Sung

1

La cláusula where se utiliza para limitar los argumentos que se pueden pasar al usar genéricos. Cuando crea una clase genérica, podría ser lo mejor para usted especificar un tipo de argumento según cómo planea usar T en su clase. Si hay algo más que lo que System.Object puede hacer, entonces probablemente sea mejor utilizar un constraint ya que obtendrá un error de tiempo de compilación frente a un tiempo de ejecución.

ejemplo

Si crea una clase

class Person<T> where T : System.IComparable<T> 
{ 
    //can now use CompareTo 
} 

No se puede dejar pasar esta clase de cosa que no implementa IComparable. Por lo tanto, ahora es seguro usar CompareTo en cualquier elemento que pase a la clase Persona.

1

Es una forma de restringir el tipo utilizado como argumentos genéricos. Por lo tanto:

where T : SomeType 

Medios que T o bien debe derivarse de SomeType o implementar la interfaz SomeType

5

Además de lo que los otros dijeron, tiene también el siguiente:

  • nueva () - T debe tener el constructor predeterminado
  • clase - T debe ser un tipo de referencia
  • struct - T debe ser un tipo de valor