Đây có phải là điều lạ vì B mở rộng A?
Bạn có ý tưởng đúng, nhưng theo hướng sai. Hãy xem xét một ví dụ dễ hiểu hơn về lý do:
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());
Điều đó rõ ràng là hợp pháp. dm cần phải là một phương pháp mà có một động vật có vú, và nó được.
D dt = DoTiger;
dt(new Giraffe());
Điều đó rõ ràng là bất hợp pháp. Bạn không thể chỉ định một phương pháp đưa một con hổ đến một đại biểu có động vật có vú, bởi vì một đại biểu có động vật có vú có thể lấy bất kỳ động vật có vú nào, không chỉ là một con hổ. Nếu điều này là hợp pháp thì nó sẽ có thể vượt qua một con hươu cao cổ với một phương pháp mà có một con hổ.
Điều này thì sao?
D da = DoAnimal;
da(new Giraffe());
Tốt thôi. da là một đại biểu cho một phương pháp mà có bất kỳ động vật có vú. Một phương pháp mà có bất kỳ động vật rõ ràng cũng có bất kỳ động vật có vú. Bạn có thể gán DoAnimal (Động vật) cho một đại biểu D (Mammal) vì động vật có vú kéo dài động vật. Bạn thấy bây giờ làm thế nào bạn có hướng mở rộng về phía sau?
loại Return về công tác Mặt khác theo cách mà bạn nghĩ rằng họ làm:
delegate Mammal F();
static Animal GetAnimal() {...}
static Mammal GetMammal() {...}
static Tiger GetTiger() {...}
F fm = GetMammal;
Mammal m = fm();
Không vấn đề gì đó.
F ft = GetTiger;
Mammal t = ft();
Không vấn đề gì ở đó; GetTiger trả về một con hổ, vì vậy bạn có thể gán nó cho một đại biểu yêu cầu mục tiêu của nó trả về một động vật có vú.
F fa = GetAnimal;
Mammal a = fa();
Điều đó không tốt. GetAnimal có thể trả về một con rắn, và bây giờ bạn có một biến gõ là động vật có vú có chứa một con rắn. Điều này là bất hợp pháp.
Tính năng này được gọi là "hiệp phương sai và đối nghịch của các chuyển đổi nhóm thành viên" và được giới thiệu trong C# 2.0. Để biết thêm thông tin về chủ đề này, hãy xem bài viết của tôi về bài viết đó:
http://blogs.msdn.com/b/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx
Có ném ngoại lệ hoặc không biên soạn không? – Elisha
Điều đó không nên gây ra sự cố. Bạn có thể dán mã đã thay đổi ở đây không? Chỉ cần biết làm thế nào bạn đang thay đổi nó? –
@Mamta Dalal - Đã chỉnh sửa câu hỏi của tôi, hy vọng điều này sẽ làm rõ hơn một chút. – Kevin