=============
CẬP NHẬT: Tôi đã sử dụng câu trả lời này làm cơ sở cho mục blog này:
Tại sao tham số ref và out không cho phép biến thể kiểu?
Xem trang blog để biết thêm bình luận về vấn đề này. Cảm ơn vì câu hỏi tuyệt vời của bạn.
=============
Giả sử bạn có các lớp học Animal, Mammal, Reptile, Giraffe, Turtlevà Tiger, với các mối quan hệ subclassing rõ ràng.
Bây giờ giả sử bạn có một phương pháp void M(ref Mammal m). Mcả hai có thể đọc và ghi m.
Bạn có thể vượt qua một biến kiểu Animalđể M?
Không. Biến đó có thể chứa a Turtle, nhưng Msẽ cho rằng nó chỉ chứa Động vật có vú. A Turtlekhông phải là a Mammal.
Kết luận 1 : reftham số không thể được thực hiện "lớn hơn". (Có nhiều động vật hơn động vật có vú, vì vậy biến số ngày càng "lớn hơn" vì nó có thể chứa nhiều thứ hơn.)
Bạn có thể vượt qua một biến kiểu Giraffeđể M?
Số Mcó thể viết mvà Mcó thể muốn viết Tigervào m. Bây giờ bạn đã đặt Tigermột biến thực sự là loại Giraffe.
Kết luận 2 : reftham số không thể được thực hiện "nhỏ hơn".
Bây giờ hãy xem xét N(out Mammal n).
Bạn có thể vượt qua một biến kiểu Giraffeđể N?
Số Ncó thể viết nvà Ncó thể muốn viết a Tiger.
Kết luận 3 : outtham số không thể được thực hiện "nhỏ hơn".
Bạn có thể vượt qua một biến kiểu Animalđể N?
Hừm.
Cũng tại sao không? NKhông thể đọc từ n, nó chỉ có thể viết cho nó, phải không? Bạn viết một Tigerbiến cho một loại Animalvà bạn đã hoàn tất, phải không?
Sai lầm. Quy tắc không phải là " Nchỉ có thể ghi vào n".
Các quy tắc là, ngắn gọn:
1) Nphải ghi vào ntrước khi Ntrở lại bình thường. (Nếu Nném, tất cả các cược đã tắt.)
2) Nphải viết một cái gì đó ntrước khi nó đọc một cái gì đó từ n.
Điều đó cho phép chuỗi sự kiện này:
- Khai báo một lĩnh vực
xloại Animal.
- Truyền
xnhư một outtham số cho N.
Nviết một Tigervào n, đó là một bí danh cho x.
- Trên một chủ đề khác, ai đó viết một
Turtlevào x.
Ncố gắng đọc nội dung của nvà phát hiện ra một Turtletrong những gì nó nghĩ là một biến loại Mammal.
Rõ ràng chúng tôi muốn làm cho bất hợp pháp.
Kết luận 4 : outtham số không thể được thực hiện "lớn hơn".
Kết luận cuối cùng : Cả tham số refcũng không outthể thay đổi loại của chúng. Để làm khác là phá vỡ sự an toàn loại có thể kiểm chứng.
Nếu những vấn đề này trong lý thuyết loại cơ bản khiến bạn quan tâm, hãy xem xét việc đọc loạt bài của tôi về cách hiệp phương sai và chống đối tác hoạt động trong C # 4.0 .