=============
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
, Turtle
và 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)
. M
cả 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 M
sẽ cho rằng nó chỉ chứa Động vật có vú. A Turtle
không phải là a Mammal
.
Kết luận 1 : ref
tham 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ố M
có thể viết m
và M
có thể muốn viết Tiger
vào m
. Bây giờ bạn đã đặt Tiger
một biến thực sự là loại Giraffe
.
Kết luận 2 : ref
tham 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ố N
có thể viết n
và N
có thể muốn viết a Tiger
.
Kết luận 3 : out
tham 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? N
Không thể đọc từ n
, nó chỉ có thể viết cho nó, phải không? Bạn viết một Tiger
biến cho một loại Animal
và bạn đã hoàn tất, phải không?
Sai lầm. Quy tắc không phải là " N
chỉ có thể ghi vào n
".
Các quy tắc là, ngắn gọn:
1) N
phải ghi vào n
trước khi N
trở lại bình thường. (Nếu N
ném, tất cả các cược đã tắt.)
2) N
phải viết một cái gì đó n
trướ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
x
loại Animal
.
- Truyền
x
như một out
tham số cho N
.
N
viết một Tiger
vào n
, đó là một bí danh cho x
.
- Trên một chủ đề khác, ai đó viết một
Turtle
vào x
.
N
cố gắng đọc nội dung của n
và phát hiện ra một Turtle
trong 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 : out
tham số không thể được thực hiện "lớn hơn".
Kết luận cuối cùng : Cả tham số ref
cũng không out
thể 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 .