Khi xác định giao diện của chúng ta trong C# 4.0, chúng ta được phép đánh dấu từng tham số chung là in
hoặc out
. Nếu chúng ta cố gắng thiết lập một tham số chung như vậy và điều đó dẫn đến một vấn đề, trình biên dịch sẽ gây ra lỗi, không cho phép chúng ta làm điều đó.Hiệp phương sai và suy luận tương ứng trong C# 4.0
Câu hỏi:
Nếu trình biên dịch có cách suy luận sử dụng hợp lệ cho cả covariance
(out
) và contravariance
(in
) là gì, tại sao chúng ta phải đánh dấu các giao diện như vậy? Nó sẽ không đủ để chỉ cho chúng tôi xác định các giao diện như chúng tôi luôn làm và khi chúng tôi cố gắng sử dụng chúng trong mã máy khách của chúng tôi, hãy nêu ra lỗi nếu chúng tôi cố gắng sử dụng chúng theo cách không an toàn?
Ví dụ:
interface MyInterface<out T> {
T abracadabra();
}
//works OK
interface MyInterface2<in T> {
T abracadabra();
}
//compiler raises an error.
//This makes me think that the compiler is cappable
//of understanding what situations might generate
//run-time problems and then prohibits them.
Ngoài ra,
không phải là nó những gì Java nào trong tình huống tương tự? Từ những gì tôi nhớ lại, bạn chỉ cần thực hiện một cái gì đó như
IMyInterface<? extends whatever> myInterface; //covariance
IMyInterface<? super whatever> myInterface2; //contravariance
Hoặc tôi đang trộn những thứ?
Cảm ơn
Tôi nghĩ câu hỏi thứ hai của ông giống như "Chú thích phương sai của C# khác với các loại ký tự đại diện của Java như thế nào?" – Gabe
@Gabe: C# thực hiện * khai báo trang web * phương sai. Java thực hiện * phương sai call-site *. Biến trang web cuộc gọi là một ý tưởng thú vị để chắc chắn, nhưng tôi cảm thấy lạ khi có một loại biến thể dựa trên cách nó được sử dụng tại một trang web cụ thể, trái ngược với cách nó được định nghĩa để hoạt động. –
Vâng, bây giờ tôi có vấn đề với việc sử dụng Java. Nó có lợi ích là không cần phải nêu rõ các tham số của giao diện như trong hoặc ngoài, nhưng sau đó một số máy khách có thể sử dụng nó ngay bây giờ mà sau này có thể không được báo cáo nếu tôi có kế hoạch cập nhật giao diện của mình. –