Учитывая этот волшебный интерфейс:
public interface IHat<out TRabbit>
{
TRabbit Take();
}
И эта иерархия классов:
public class Rabbit { }
public class WhiteRabbit : Rabbit { }
Теперь я могу скомпилировать это:
IHat<WhiteRabbit> hat1 = null;
IHat<Rabbit> hat2 = hat1;
Это здорово. Но что, если я определяю интерфейс по-разному:
public interface IHat<out TRabbit>
{
bool Take(out TRabbit r);
}
Я указываю, что шляпа может быть пуста, используя отдельное логическое возвращаемое значение (предыдущая версия, возможно, вернула бы нулевого кролика из пустой шляпы). Но я все еще только выводя кролика, поэтому ничего не делаю логически иначе, чем предыдущая версия.
Компилятор С# 4.0 в CTP дает ошибку в определении интерфейса - для этого требуется, чтобы параметры метода out вне инвариантного типа. Существует ли жесткая причина, почему это недопустимо, или это то, что может быть рассмотрено в будущей версии?