Tôi đã đọc về những thay đổi mà .NET4.5 sẽ mang lại, và trên this bài đăng trên blog tôi tình cờ gặp một điều mà tôi không biết cũng không hiểu.Ngôn ngữ C# ngăn chặn các generics bị covarient như thế nào trừ khi chúng không chứa các phương thức yêu cầu T làm đầu vào?
Khi nói về việc thực hiện các bộ sưu tập readonly, Immo Landwerth nói:
Thật không may, hệ thống kiểu của chúng tôi không cho phép làm loại T hiệp biến trừ khi nó không có phương pháp mà phải mất T như một đầu vào. Do đó, chúng tôi không thể thêm phương thức IndexOf vào IReadOnlyList. Chúng tôi tin rằng đây là một sự hy sinh nhỏ so với việc không có sự hỗ trợ cho hiệp phương sai.
Từ sự hiểu biết rõ ràng giới hạn của tôi, nó có vẻ như ông đang nói rằng để cho phép chúng tôi để gọi một phương pháp mà đòi hỏi một IReadOnlyList<Shape>
bằng cách đi qua trong một IReadOnlyList<Circle>
, chúng ta không thể có một phương pháp IReadOnlyList<T>.IndexOf(T someShape)
.
Tôi không thấy hệ thống kiểu sẽ ngăn chặn điều đó như thế nào. Ai đó có thể giải thích?
Đủ công bằng. Tôi đã có thể nghĩ rằng IndexOf sẽ chỉ trở lại -1 nếu nó nhận được một loại không chính xác. Dunno tại sao tôi nghĩ vậy, điều đó có nghĩa là cần phải kiểm tra kiểu nào đó trong từng phương pháp. Tôi sẽ đi thẳng vào các bài đăng trên blog của eric. Cậu bé nhưng người đàn ông đó có thể giải thích điều gì đó theo cách tôi có thể hiểu! –
Những gì một biến thể 'IReadOnlyList 'có thể thực hiện sẽ là' IndexOf (TT nó) ', trong đó kiểu tham số của phương thức độc lập với bộ sưu tập. Một lớp 'List ' có thể thực thi 'IndexOf' của nó sau đó có thể sử dụng ủy nhiệm được tạo ra (được lưu trữ) một cách lười biếng cho mỗi loại' TT', để nếu 'TItem' thực hiện' IEquatable . phương thức tĩnh sẽ gọi đó, và ngược lại, nó sẽ tạo một đại biểu cho một phương thức tĩnh sử dụng một số so sánh khác hoặc, đối với một số kiểu kết hợp 'TT' và' T', đơn giản trả về -1. –
supercat