Khi bạn nói Y y = (Y)x;
diễn viên này nói với trình biên dịch "tin tưởng tôi, bất cứ điều gì x
là, lúc chạy nó có thể được đúc thành một Y
, vì vậy, chỉ cần làm điều đó, được không?"
Nhưng khi bạn nói
List<Banana> aBunchOfBananas = new List<Banana>();
Banana justOneBanana = (Banana)aBunchOfBananas;
trình biên dịch có thể nhìn vào các định nghĩa cho mỗi người trong các lớp bê tông (Banana
và List<Banana>
) và thấy rằng không có static explicit operator Banana(List<Banana> bananas)
định nghĩa (hãy nhớ, một diễn viên rõ ràng phải được xác định trong một trong hai loại được đúc hoặc loại được đúc, điều này là từ thông số kỹ thuật, phần 17.9.4). Nó biết tại thời gian biên dịch những gì bạn đang nói có thể không bao giờ là sự thật. Vì vậy, nó hét lên với bạn để ngăn chặn nói dối.
Nhưng khi bạn nói
IEnumerable<Banana> aBunchOfBananas = new List<Banana>();
Banana justOneBanana = (Banana)aBunchOfBananas;
tốt, bây giờ là trình biên dịch không biết. Nó rất tốt có thể là trường hợp mà bất cứ điều gì aBunchOfBananas
xảy ra được tại thời gian chạy, loại bê tông X
có thể đã xác định static explicit operator Banana(X bananas)
. Vì vậy, trình biên dịch tin tưởng bạn, giống như bạn yêu cầu nó.
Một danh sách những thứ không phải là điều duy nhất. –
Tuy nhiên, không được phép có loại giá trị. – ken2k
Điều này cũng táo (ok áp dụng) để IList. Đó là những gì làm cho toàn bộ giao diện vs lớp bê tông nhấp cho tôi trong các câu trả lời dưới đây. –
deepee1