No puedo encontrar ninguna razón para que el C# no pueda copiar teóricamente las restricciones. Pero el comportamiento documentado de hacernos copiar (o aumentar) explícitamente parece ser la forma más sencilla de usabilidad.
public class A{}
public class B : A {}
public class X<T> where T: A {}
public class Y<T> : X<T> where T: B { }
En lo anterior, tenga en cuenta que yo no tenía que explicty copiar sobre la restricción en Y<T>
, porque un B
es siempre un A
.
Ahora veamos qué sucede si el "compilador copia automáticamente las restricciones". Digamos que defino Y<T>
sin restricciones y el compilador las coloca automáticamente. Yo uso Y<T>
en muchos códigos. Luego modifico las restricciones en la declaración de X<T>
para incluir alguna nueva interfaz.
Los errores de compilación para cambiar la declaración de X<T>
se encuentran en los sitios donde yo utilizo Y<T>
!
Con la forma en que funciona actualmente el compilador de C#, los errores del compilador están en los usos de X<T>
, como era de esperar si lo cambio de manera abrupta.
Por lo tanto, si bien sería conveniente en algunos escenarios, también sería algo confuso en otros. Si bien ambos son enfoques válidos, asumiría (nótese que no puedo leer las mentes del equipo de diseño de C#) que fue una decisión y no puramente técnica.
Digo "no puramente técnico", pero ciertamente puedo imaginar algunos escenarios de interfaz donde sería más simple verificar que se cumplan todas las restricciones, en lugar de producir la restricción más simple que cumpla con todas las restricciones heredadas requeridas.
No es necesario copiar las restricciones, también puede optar por usar algo que sea convertible al tipo de restricción principal, lo que hará que el niño sea más especializado. –
La especificación de C# 4.0 dice más o menos lo mismo (§13.4.3), pero no proporciona una razón. – Oded
¿Qué ocurre si mi parámetro genérico en la subclase tiene restricciones contradictorias para el parámetro genérico en la clase base? – Paul