Czy to nie jest dziwne, bo B rozszerza?
Masz właściwy pomysł, ale w złym kierunku. Rozważmy przykład, który jest łatwiejszy do zrozumienia:
class Animal {}
class Reptile : Animal {}
class Snake : Reptile {}
class Mammal : Animal {}
class Tiger : Mammal {}
class Giraffe : Mammal {}
delegate void D(Mammal m);
static void DoAnimal(Animal a) {}
static void DoMammal(Mammal m) {}
static void DoTiger(Tiger t) {}
D dm = DoMammal;
dm(new Tiger());
To jest oczywiście legalne. dm musi być metodą, która bierze Ssak i jest.
D dt = DoTiger;
dt(new Giraffe());
To musi być nielegalne. Nie można przypisać metody, która zabiera tygrysa do delegata, który zabiera ssaka, ponieważ delegat zabierający ssaka może wziąć dowolnego ssaka, a nie tylko tygrysa. Gdyby to było zgodne z prawem, możliwe byłoby przekazanie żyrafy do metody, która zabiera tygrysa.
Co z tym?
D da = DoAnimal;
da(new Giraffe());
W porządku. da jest delegatem metody, która przyjmuje dowolnego ssaka. Metoda, która przyjmuje dowolne zwierzę, wyraźnie bierze również dowolnego ssaka. Możesz przypisać DoAnimal (Zwierzę) do delegata D (Ssak), ponieważ Ssak rozciąga Zwierzę. Widzisz teraz, w jaki sposób przesunąłeś kierunek przedłużenia do tyłu?
typy powrotu na drugiej pracy ręcznej sposób myślenia robią:
delegate Mammal F();
static Animal GetAnimal() {...}
static Mammal GetMammal() {...}
static Tiger GetTiger() {...}
F fm = GetMammal;
Mammal m = fm();
nie ma problemu.
F ft = GetTiger;
Mammal t = ft();
Nie ma problemu; GetTiger zwraca Tiger, więc możesz przypisać go do delegata, który wymaga, aby jego cel zwrócił ssaka.
F fa = GetAnimal;
Mammal a = fa();
To nie jest dobre. GetAnimal może zwrócić Snake, a teraz masz zmienną wpisaną jako Mammal, która zawiera Snake. To musi być nielegalne.
Ta funkcja jest nazywana "kowariancją i kontrawariancją konwersji grup członków" i została wprowadzona w języku C# 2.0. Aby uzyskać więcej informacji na ten temat patrz mój artykuł na jej temat:
http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx
Czy to wyjątek lub nie w kompilacji? – Elisha
To nie powinno powodować problemu. Czy możesz tutaj wkleić zmieniony kod? Po prostu wiesz, jak to zmieniasz? –
@Mamta Dalal - Zmieniono moje pytanie, mam nadzieję, że to wyjaśni nieco więcej. – Kevin