Возьмите этот небольшой пример LINQPad:
void Main()
{
Foo<object> foo = new Foo<string>();
Console.WriteLine(foo.Get());
}
class Foo<out T>
{
public T Get()
{
return default(T);
}
}
Не удается скомпилировать эту ошибку:
Недействительный модификатор отклонения. В качестве варианта можно указать только параметры интерфейса и типа делегата.
Я не вижу никакой логической проблемы с кодом. Все можно статически проверять. Почему это не разрешено? Может ли это вызвать некоторую несогласованность в языке или было ли это слишком дорогостоящим для реализации из-за ограничений в CLR? Если это последнее, что я должен знать разработчику об упомянутом ограничении?
Учитывая, что интерфейсы поддерживают его, я ожидал бы, что поддержка классов будет логически следовать из этого.