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.
+1 Esto es bastante compresivo. Ojalá pueda preferir una respuesta. – Sung