Учитывая этот волшебный интерфейс:
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);
}
Я указываю, что шляпа может быть пустой, используя отдельное логическое возвращаемое значение (предыдущая версия, возможно, вернула бы нулевого кролика из пустой шляпы). Но я по-прежнему только выводю кролика, поэтому не делаю ничего логически отличного от предыдущей версии.
Компилятор C # 4.0 в CTP выдает ошибку в определении интерфейса - он требует, чтобы параметры метода out были инвариантного типа. Есть ли серьезная причина, почему это не разрешено, или это что-то, что может быть исправлено в будущей версии?