2011-07-19 23 views
7

Tôi hiện đang đọc về hiệp phương sai và đối ứng trong C#.Không hiệp phương sai/contravariance áp dụng cho các loại chuyển đổi ngầm mà không thực hiện một giao diện chung?

Tất cả các ví dụ đều có chi tiết về các đối tượng có thể chuyển đổi và khác nhau do tính chính xác từ việc triển khai Giao diện, ví dụ:

đâu Circle : IShape

Hiệp phương sai: SomeType<Circle> as SomeType<IShape>
Contravariance: SomeType<IShape> as SomeType<Circle>


Nếu TypeATypeB từng có một implicit converter viết để chuyển đổi sang loại khác, nhưng không thực hiện bất kỳ giao diện chung , là nó vẫn chính xác để nói về hiệp phương sai/contravariance khi đối phó với việc chuyển đổi generics của thes e loại? Hay đây là một khái niệm khác?

Trả lời

2

Khái niệm khác nhau. Hiệp phương sai theo nghĩa out (hoặc contravariance qua in) luôn luôn tham chiếu-bảo quản, không có biến đổi nào cả - chỉ là cùng một tham chiếu trong các thuật ngữ khác (có thể chứng minh). Đây cũng là lý do tại sao nó không áp dụng cho các cấu trúc thực hiện một giao diện, vì một hộp không phải là tham chiếu-bảo quản. Logic giữ nguyên tham chiếu tương tự cũng áp dụng cho phép gán biến đổi của các mảng của kiểu tham chiếu.

+0

Có tên cho khái niệm này không? Có một loại phương sai chung khác không? – StuperUser

1

Các loại không cần phải triển khai giao diện chung để trở thành đồng/biến thể.

Các điều khoản chỉ đơn giản đề cập đến việc chuyển đổi có dẫn đến mất thông tin hoặc tăng thông tin tiềm năng hay không. Điều này cũng có liên quan khi áp dụng cho các đối tượng thừa kế vì nó được áp dụng cho các đôi và phao.

Vì vậy, có vẫn đúng khi nói về co/contra-variance khi nói về các đối tượng không có giao diện chung miễn là có một trình chuyển đổi ẩn.

Các vấn đề liên quan