Например, интерфейс IEnumerable<T>
:
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
В этом интерфейсе общий тип используется только как возвращаемый тип метода интерфейса и не используется в качестве типа аргументов метода, поэтому он может быть ковариантным. Давая это, теоретически не может компилятор вывести дисперсию из интерфейса? Если это возможно, то почему С# требует, чтобы мы задавали ключевые слова co/contravariance явно.
Обновление. Как сказал Джон Скит, этот вопрос можно разделить на следующие вопросы:
-
Может компилятор выводит общий тип co/contravariance на то, как он используется внутри текущего родового типа и всех его базовых типов?
Например. Сколько общих параметров интерфейса из .NET Framework 4.0 может быть отмечено co/contravariant автоматически без какой-либо двусмысленности? Около 70%, 80%, 90% или 100%?
-
Если это возможно, должен применять по умолчанию co/contravariance к родовым типам? По крайней мере, для тех типов, которые он способен анализировать и вывести co/contravariance из использования типа.