Почему ковариантный тип не используется в качестве универсального ограничения для методов интерфейса? (С#)

Проблема:

interface ICovariant<out R>
{
    // The following statement generates a compiler error
    // because you can use only contravariant or invariant types
    // in generic constraints.
    // void DoSomething<T>() where T : R;
}

Почему общее ограничение на методы в этом случае не допускается.

РЕДАКТИРОВАТЬ: Лол, я нашел ответ, универсальный тип T в методе на самом деле является аргументом (или входом) и, следовательно, не является ковариантным.


person GameOver    schedule 12.09.2020    source источник
comment
Вместо того, чтобы быть void DoSomething‹T›(), где T : R; Это должно быть просто void DoSomething‹R›();   -  person DCCoder    schedule 12.09.2020
comment
Поскольку R является ковариантным, ICovariant<string> cs = default; ICovariant<object> co = cs; является допустимым, что позволяет cs.DoSomething<FileInfo>(); нарушить ограничение.   -  person Aluan Haddad    schedule 12.09.2020
comment
нет, это не отвечает на вопрос, я специально спрашиваю, почему предоставленное мной заявление не разрешено   -  person GameOver    schedule 12.09.2020
comment
@DCCoder Нет. В этом случае R будет другим универсальным типом (который не ограничен), и вы получите предупреждение о том, что он имеет то же имя, что и другой R.   -  person 41686d6564    schedule 12.09.2020
comment
@GameOver кажется, что размещенная ссылка 41686d6564 точно отвечает на этот вопрос.   -  person DCCoder    schedule 12.09.2020
comment
@GameOver нет, это не ответ на вопрос Не смотрите просто на вопрос и не решайте, что он отличается от вашего. Вы читали принятый ответ? В основном это говорит о том, что Алуан сказал в комментарии выше, и вы приняли (в теперь удаленном комментарии). Единственное отличие состоит в том, что в ответе Эрика используется параметр традиционного метода, а в вашем коде используется параметр универсального типа. Хотя правило то же. Это относится к обоим.   -  person 41686d6564    schedule 12.09.2020