con los genéricos, puede agregar una restricción que significa que el tipo genérico suministrado debe cumplir algunas condiciones, por ejemplo:
where T : new()
- T
debe tener un constructor sin parámetros pública (o ser un struct
)
where T : class
-T
debe ser una referencia de tipo (class
/interface
/delegate
)
where T : struct
-T
debe haber un tipo de valor (otro que Nullable<TSomethingElse>
)
where T : SomeBaseType
-T
debe ser heredado de SomeBaseType
(o SomeBaseType
sí mismo)
where T : ISomeInterface
- T
deben implementar ISomeInterface
por ejemplo:
public void SomeGenericMethod<T>(T data) where T : IEnumerable {
foreach(var obj in data) {
....
}
}
es SomeBaseType
y ISomeInterface
que son interesantes aquí, ya que te permiten exigir (y usar) func ciones definidas en esos tipos; por ejemplo, where T : IList
le da acceso a Add(...)
etc. ¡SIN EMBARGO!simplemente: no hay tal mecanismo para cosas como:
- constructores con parámetros
- métodos estáticos
- operadores/conversiones
- métodos arbitrarios no se definen a través de un tipo de base o interfaz
así que no puede solicitarlos, y no puede usarlos (excepto a través de la reflexión). Para algunos de esos dynamic
se puede utilizar, sin embargo.
buena explicación. – Idrees