Por ejemplo IEnumerable<T>
interfaz:¿Por qué las interfaces genéricas no son co/contravariantes por defecto?
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
En esta interfaz del tipo genérico se utiliza sólo como un tipo de retorno de método de interfaz y no se utiliza como un tipo de argumentos del método por lo tanto puede ser covariante. Dando esto, ¿no puede el compilador inferir teóricamente la varianza de la interfaz? Si puede, ¿por qué C# requiere que establezcamos palabras clave de co/contravarianza explícitamente?
actualización: Como Jon Skeet mencionó esta pregunta se puede spited en sub-preguntas:
Puede compilador inferir de tipo genérico co/contravarianza por la forma en que se utiliza dentro de tipo genérico actual y todos son tipos básicos?
Por ejemplo ... ¿Cuántos parámetros genéricos de interfaz de .NET Framework 4.0 se pueden marcar co/contravariante automáticamente sin ambigüedad alguna? Alrededor del 70%, 80%, 90% o 100%?
Si puede, debe aplicar co/contravarianza a los tipos genéricos de forma predeterminada? Al menos para aquellos tipos que es capaz de analizar e inferir co/contravariancia del uso del tipo.
Hay algunas excelentes respuestas a continuación con respecto a por qué esto no es automático. Solo quería agregar que ReSharper * * sugerirá co/contra-varianza e incluso hará la refactorización por usted si acepta sus sugerencias. Sin embargo, no sé qué tan bien funciona en las situaciones ambiguas/difíciles (supongo que no intentará una sugerencia en esos casos). –
Excelente pregunta. Anticipé su pregunta en 2007 cuando estábamos diseñando esta característica. Por eso escribí un artículo que me contestaba en ese momento: http://blogs.msdn.com/b/ericlippert/archive/2007/10/29/covariance-and-contravariance-inc-c-seven-why- do-we-need-a-syntax-at-all.aspx –