Según el título, ¿es posible declarar restricciones de negación de tipo en C# 4?restricción genérica NOT donde T:! IEnumerable
Respuesta
No, no existe tal concepto ni en C# ni en el CLR.
¿Este concepto llegará a C# y/o CLR en el futuro? –
@RandRandom: No he oído hablar de ningún plan para ello. –
No, pero sería posible comprobar con un "es" y luego manejarlo apropiadamente ...
Se utiliza una restricción para que pueda garantizar el tipo que utiliza tiene algunas propiedades/métodos/.. desea usar.
Un genérico con una restricción de negación de tipo no tiene ningún sentido, ya que no tiene sentido conocer la ausencia de algunas propiedades/métodos que no desea utilizar.
obviamente no ha recibido el error: ## '
Pude trabajar alrededor de mi escenario usando una serie de clases abstractas que implementan una instancia de la interfaz similar y heredan la clase abstracta. Supongo así es como lo hace la Acción
Por lo que sé, no es posible hacer eso.
Lo que puede hacer es algunas comprobaciones en tiempo de ejecución:
public bool MyGenericMethod<T>()
{
// if (T is IEnumerable) // don't do this
if (typeof(T).GetInterface("IEnumerable") == null)
return false;
// ...
return true;
}
No puede usar 'es 'así - comprueba si un * objeto * es compatible con un tipo. –
lo que quiere decir es 'if (typeof (T) == typeof (IEnumerable)) {}' – kev
un uso para esto sería un tipo de opción.
public class Option<A,B>
where A : !B
where B : !A
{
private readonly A a;
private readonly B b;
private Option(){}
public Option(A a)
{
this.a = a
}
public Option(B b)
{
this.b = b
}
}
la comprobación del tiempo de ejecución funcionaría, por supuesto, pero no tendría la ventaja de comprobar el tipo en tiempo de compilación.
me encontré a mi mismo tratando de poner en práctica el mismo caso mencionado en los comentarios:
void doIt<T>(IEnumerable<T> what) { }
void doIt<T>(T whats) { }
I exceptúan el siguiente código para hacer referencia al primer método:
doIt(new List<T>());
Pero es realmente hace referencia al segundo.
Una solución es fundido el argumento de la siguiente manera:
doIt(new List<T>().AsEnumerable<T>());
El molde puede estar escondido tras otra sobrecarga:
void doIt<T>(List<T> whats) {
doIt(whats.AsEnumerable<T>());
}
- 1. C# restricción genérica donde no es clase?
- 2. Extensiones para IEnumerable genérica
- 3. Cómo convertir un IEnumerable <IEnumerable <T>> a un IEnumerable <T>
- 4. Interfaz explícitamente implementada y restricción genérica
- 5. limitaciones genérico, donde T: struct y donde T: clase
- 6. Cualquier equivalencia VBNET de C# donde la palabra clave de restricción genérica?
- 7. ¿Cómo se implementa IEnumerable <T>
- 8. Método genérico donde T es type1 o type2
- 9. IEnumerable <IEnumerable <T>> IEnumerable a <T> usando LINQ
- 10. Obtener un IEnumerable <T> de un IEnumerable <IEnumerable <T>>
- 11. Dado "donde T: new()", hace "new T()" usar Activator.CreateInstance internamente?
- 12. Por qué IEnumerable <T> se define como IEnumerable <out T>, no IEnumerable <T>
- 13. donde t: múltiples clases
- 14. La agrupación de artículos idénticos consecutivos: IEnumerable <T> a IEnumerable <IEnumerable <T>>
- 15. Sobrecargas de métodos que difieren solo por la restricción genérica
- 16. IEnumerable.GetEnumerator() y IEnumerable <T> .GetEnumerator()
- 17. Restricción genérica para hacer coincidir los tipos numéricos
- 18. XML para IEnumerable <T>
- 19. C# restricción genérica no funciona como se esperaba
- 20. Restricción genérica a ValueTypes, Cadenas y Nullable de ValueTypes
- 21. ¿Por qué IEnumerable <T> hereda de IEnumerable?
- 22. Convertir/Convertir IEnumerable en IEnumerable <T>
- 23. Diferencia entre IEnumerable e IEnumerable <T>?
- 24. Restricción de espacio de nombres con declaración de clase genérica
- 25. Clase genérica con problema de acceso de restricción
- 26. Convertir DataTable a IEnumerable <T>
- 27. ¿Cómo se puede convertir T en una clase para que coincida con una restricción "donde T: clase"?
- 28. ¿Por qué ICollection <T> implementar tanto IEnumerable <T> y IEnumerable
- 29. función genérica con una restricción "tiene la propiedad X"?
- 30. conseguir tipo T de IEnumerable <T>
incluso si lo hubiera, ¿puede describir un caso de uso? –
Es extraño observar que tiene tal requisito. solo puedes codificar contra el tipo T que sabes que pertenece a una familia de clase. ¿Cómo se puede codificar en genéricos de lo contrario? O no necesita genéricos en este caso o necesita revisar sus casos de uso. –
el caso de uso de interés era permitir que las siguientes sobrecargas coexistieran 'void doIt (T what) {}' 'void doIt (IEnumerable cuál es) {}' - en este momento hay ambigüedad porque 'T 'en el primer método podría ser un' IEnumerable <> '(así que me gustaría especificar que' T' NO debe ser 'IEnumerable') ... –
Cel