Если у компилятора есть способы определения того, что является допустимым использованием как для ковариации (выход), так и для контравариантности (вход), почему мы должны помечать интерфейсы как таковые?
Я не совсем уверен, что понимаю вопрос. Я думаю, что вы спрашиваете две вещи.
1) Может ли компилятор выводить дисперсионные аннотации?
и
2) Почему C # не поддерживает дисперсию колл-сайта, как в Java?
Ответ на первый вопрос:
interface IRezrov<V, W>
{
IRezrov<V, W> Rezrov(IRezrov<W, V> x);
}
Я приглашаю вас попытаться определить, какие все юридически возможные аннотации отклонений есть на V и W. Вы можете получить сюрприз.
Если вы не можете определить уникальную аннотацию наилучшей дисперсии для этого метода, почему, по вашему мнению, компилятор может?
Больше причин здесь:
http://blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why-do-we-need-a-syntax-at-all.aspx
В более общем смысле: ваш вопрос указывает на ошибочные рассуждения. Возможность дешевой проверки правильности решения не логически означает, что существует дешевый способ найти правильное решение. Например, компьютер может легко проверить, является ли p * q == r истинным или ложным для двух тысячных простых чисел p и q. Это не означает, что легко взять r и найти p и q такими, что равенство выполнено. Компилятор может легко проверить правильность или неправильность аннотации; это не означает, что он может найти правильную аннотацию отклонений среди потенциально миллиардов возможных аннотаций.
Ответ на второй вопрос: C # не Java.