Ví dụ giao diện IEnumerable<T>
:Tại sao giao diện chung không đồng/contravariant theo mặc định?
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
Trong giao diện này kiểu generic chỉ được sử dụng như một kiểu trả về của phương thức giao diện và không được sử dụng như một loại đối số phương pháp như vậy, nó có thể được hiệp biến. Đưa ra điều này, không thể trình biên dịch suy luận về mặt phương sai từ giao diện? Nếu có thể, tại sao C# yêu cầu chúng tôi đặt các từ khóa co/contravariance một cách rõ ràng.
Cập nhật: Như Jon Skeet nêu câu hỏi này có thể được spited thành các câu hỏi sau:
Can biên dịch suy luận chung loại của đồng/contravariance bởi cách nó được sử dụng bên trong loại generic hiện tại và tất cả đó là loại cơ sở?
Ví dụ: Có bao nhiêu tham số giao diện chung từ .NET Framework 4.0 có thể được đánh dấu đồng/contravariant tự động mà không có bất kỳ sự mơ hồ nào? Khoảng 70%, 80%, 90% hoặc 100%?
Nếu có thể, nên áp dụng đồng/contravariance cho loại chung theo mặc định? Ít nhất là với những loại mà nó có khả năng phân tích và phỏng đoán co/contravariance từ việc sử dụng loại.
Có một số câu trả lời tuyệt vời bên dưới về lý do tại sao điều này không phải là tự động. Tôi chỉ muốn thêm rằng ReSharper * sẽ * đề nghị co/contra-variance và thậm chí làm tái cấu trúc cho bạn nếu bạn chấp nhận đề xuất của nó. Tôi không biết nó hoạt động tốt như thế nào trong những tình huống không rõ ràng/khó khăn, mặc dù (tôi cho rằng nó sẽ không cố gắng gợi ý trong những trường hợp đó). –
Câu hỏi hay. Tôi đã dự đoán câu hỏi của bạn vào năm 2007 khi chúng tôi thiết kế tính năng này. Đó là lý do tại sao tôi đã viết một bài viết trả lời nó sau đó: http://blogs.msdn.com/b/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why- Do-we-need-a-syntax-at-all.aspx –