Non è questo strano perché B estende A?
Hai l'idea giusta, ma nella direzione sbagliata. Consideriamo un esempio più facile da ragionare:
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());
Questo è chiaramente legale. dm deve essere un metodo che accetta un mammifero, e lo è.
D dt = DoTiger;
dt(new Giraffe());
Questo deve essere chiaramente illegale. Non puoi assegnare un metodo che porti una tigre a un delegato che prende un mammifero, perché un delegato che prende un mammifero può prendere qualsiasi mammifero, non solo una tigre. Se questo fosse legale, sarebbe possibile passare una giraffa a un metodo che prende una tigre.
Che dire di questo?
D da = DoAnimal;
da(new Giraffe());
Questo va bene. da è un delegato a un metodo che accetta qualsiasi mammifero. Un metodo che prende chiaramente ogni animale prende anche qualsiasi mammifero. Puoi assegnare DoAnimal (Animale) a un delegato D (Mammifero) perché il Mammifero estende Animale. Vedi ora come hai ottenuto la direzione dell'estensione all'indietro?
tipi restituiti d'altro lavoro manuale il modo di pensare che fanno:
delegate Mammal F();
static Animal GetAnimal() {...}
static Mammal GetMammal() {...}
static Tiger GetTiger() {...}
F fm = GetMammal;
Mammal m = fm();
nessun problema.
F ft = GetTiger;
Mammal t = ft();
Nessun problema; GetTiger restituisce una tigre, quindi puoi assegnarla a un delegato che richiede che il suo bersaglio restituisca un mammifero.
F fa = GetAnimal;
Mammal a = fa();
Non va bene. GetAnimal potrebbe restituire un Snake e ora hai una variabile digitata come Mammal che contiene un Snake. Questo deve essere illegale.
Questa funzione è denominata "covarianza e controvarianza delle conversioni dei gruppi di membri" ed è stata introdotta in C# 2.0. Per ulteriori informazioni su questo argomento vedi il mio articolo su di esso:
http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx
vuol gettare un'eccezione o fallisce nella compilation? – Elisha
Questo non dovrebbe causare problemi. Puoi incollare qui il codice modificato? Solo per sapere come lo stai cambiando? –
@Mamta Dalal - Modificata la mia domanda, spero che questo chiarisca un po 'di più. – Kevin