No es esto extraño porque B se extiende A?
Tiene la idea correcta, pero en la dirección incorrecta. Consideremos un ejemplo más fácil de razonar:
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());
Eso es claramente legal. dm necesita ser un método que tome un mamífero, y lo es.
D dt = DoTiger;
dt(new Giraffe());
Eso claramente tiene que ser ilegal. No se puede asignar un método que lleve un tigre a un delegado que se lleva a un mamífero, porque un delegado que toma un mamífero puede tomar cualquier mamífero, no solo un tigre. Si esto fuera legal, entonces sería posible pasar una jirafa a un método que tome un tigre.
¿Qué tal esto?
D da = DoAnimal;
da(new Giraffe());
Eso está bien. da es un delegado de un método que toma cualquier mamífero. Un método que toma cualquier animal claramente también toma cualquier mamífero. Puede asignar DoAnimal (Animal) a un delegado D (Mamífero) porque Mamífero extiende Animal. ¿Ahora ves cómo obtuviste la dirección de extensión hacia atrás?
tipos de retorno en el otro trabajo de la mano la forma de pensar que hacen:
delegate Mammal F();
static Animal GetAnimal() {...}
static Mammal GetMammal() {...}
static Tiger GetTiger() {...}
F fm = GetMammal;
Mammal m = fm();
No hay problema.
F ft = GetTiger;
Mammal t = ft();
No hay problema; GetTiger devuelve un Tiger, por lo que puede asignarlo a un delegado que requiere que su objetivo devuelva un mamífero.
F fa = GetAnimal;
Mammal a = fa();
Eso no es bueno. GetAnimal podría devolver una Serpiente, y ahora tienes una variable escrita como Mamífero que contiene una Serpiente. Esto tiene que ser ilegal.
Esta función se denomina "covarianza y contravarianza de las conversiones de grupo de miembros" y se introdujo en C# 2.0. Para obtener más información sobre este tema, ver mi artículo sobre el mismo:
http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx
lo hace lanzar una excepción o se abstiene en la compilación? – Elisha
Eso no debería estar causando un problema. ¿Puedes pegar aquí el código modificado? ¿Solo para saber cómo lo estás cambiando? –
@Mamta Dalal - Edité mi pregunta, espero que esto lo aclare un poco más. – Kevin