Biorąc pod uwagę ten magiczny interfejs:W języku C# 4.0, dlaczego parametr out w metodzie nie może być kowariancyjny?
public interface IHat<out TRabbit>
{
TRabbit Take();
}
a ta klasa hierarchii:
public class Rabbit { }
public class WhiteRabbit : Rabbit { }
Mogę teraz skompilować to:
IHat<WhiteRabbit> hat1 = null;
IHat<Rabbit> hat2 = hat1;
co jest dobre. Ale co, jeśli mogę zdefiniować interfejs inaczej:
public interface IHat<out TRabbit>
{
bool Take(out TRabbit r);
}
mam wskazujący, że kapelusz może być pusta, za pomocą oddzielnego wartości zwracanej logiczną (poprzednia wersja będzie prawdopodobnie wrócili null królika z pustego kapelusza). Ale wciąż wysyłam tylko królika, więc nie robię nic logicznie innego niż poprzednia wersja.
Kompilator C# 4.0 w CTP podaje błąd w definicji interfejsu - wymaga, aby parametry metody "out" były typu niezmiennego. Czy istnieje niełatwy powód, dla którego nie jest to dozwolone, czy jest to coś, co można by rozwiązać w przyszłej wersji?
Dla informacji znalazłem wiele blogów itp. Mówiących to samo, ale żaden z komentarzy nie pochodzi z "oficjalnych" źródeł MS. Jestem całkiem pewny, że jest poprawny, chociaż ... wariancja C# 4.0 nadal opiera się na regułach CLI. –
To brzmi dość prawdopodobne! –