Это связано с тем, что компилятор может подумать, что необходимо небезопасное приведение типов, если вы используете модификатор параметра «out» для ковариации.
Смотрите этот сценарий. Скажем, есть метод f, ожидающий NotOK в качестве входных данных:
interface NotOK<out T>
{
bool TryDequeue(out T t);
}
void f( NotOK<Animal> x)
{
bool b ;
Animal animal_in_f;
b = x.TryDequeue(animal_in_f);
}
Посмотрите, что произойдет, если у меня есть два интерфейса:
NotOK<Animal> objA;
NotOK<Dog> objD;
Используйте objA в качестве входных данных для f, без проблем.
f(objA);
// objA should have a method of signature bool TryDequeue(out Animal t)
// inside method f, it calls x.TryDequeue(animal_in_f);
// where animal_in_f is Animal, type match
Но если ковариация разрешена, передача objD будет разрешена
f(objD);
// objD should have a method of signature bool TryDequeue(out Dog t)
// inside method f, it calls x.TryDequeue(animal_in_f);
// where animal_in_f is Animal
// but this time x.TryDequeue is expecting a Dog!!
// It is unsafe to cast animal_in_f to Dog
Итак, вы понимаете, почему out нельзя использовать в ковариации.
Я думаю, что концептуально это должно работать, потому что, используя модификатор параметра out, мы просто хотим, чтобы эта переданная переменная была выходной. Это будет работать, если у компилятора есть специальное правило, поэтому, когда он сталкивается со сценарием, как указано выше, он должен считать приведение безопасным и не генерировать ошибку.
Однако я думаю, что разработчик С# взвесил все за и против и, наконец, решил поддерживать последовательное правило проверки типов, которое в целом не допускается.
На мой взгляд, лучше добавить это специальное правило, потому что теперь оно ограничивает использование, скажем, у него не может быть метода, возвращающего два объекта типа T, который требует использования модификатора параметра out.
person
palazzo train
schedule
19.09.2014
out
способ его использования здесь не так сильно отличается отref
(отличие: он используется только как вывод, а не как ввод) - посмотрите ссылку - person Random Dev   schedule 03.07.2014