2010-04-28 32 views
8

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

Trả lời

8

Nếu trình biên dịch có cách suy luận những gì đang sử dụng có giá trị trong cả hai hiệp phương sai (trong) và contravariance (in), tại sao chúng ta phải đánh dấu các giao diện như vậy?

Tôi không chắc mình có hiểu câu hỏi hay không. Tôi nghĩ bạn đang hỏi hai điều.

1) Trình biên dịch có thể suy ra chú thích phương sai không?

2) Tại sao C# không hỗ trợ phương sai cuộc gọi trang web như Java?

Câu trả lời cho những người đầu tiên là:

interface IRezrov<V, W> 
{ 
    IRezrov<V, W> Rezrov(IRezrov<W, V> x); 
} 

tôi mời các bạn cố gắng để suy ra những gì tất cả các chú thích sai quy phạm pháp luật có thể là trên V và W. Bạn có thể nhận được một bất ngờ.

Nếu bạn không thể tìm ra chú thích phương sai tốt nhất duy nhất cho phương pháp này, tại sao bạn nghĩ trình biên dịch có thể?

Các lý do khác ở đây:

http://blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why-do-we-need-a-syntax-at-all.aspx

Tổng quát hơn: Câu hỏi của bạn cho biết lập luận nguỵ biện. Khả năng kiểm tra giá rẻ xem một giải pháp có chính xác không có nghĩa là một cách rẻ tiền để tìm ra giải pháp đúng. Ví dụ, một máy tính có thể dễ dàng xác minh xem p * q == r là đúng hay sai cho hai số nguyên tố p và q. Điều đó không có nghĩa là dễ lấy r và tìm p và q sao cho bình đẳng được thỏa mãn.Trình biên dịch có thể dễ dàng kiểm tra xem chú thích phương sai là chính xác hay không chính xác; điều đó không có nghĩa là nó có thể tìm thấy chú thích phương sai chính xác trong số hàng tỷ chú thích có thể có tiềm năng.

Câu trả lời cho câu hỏi thứ hai là: C# không phải là Java.

+0

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

+1

@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. –

+0

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. –

0

OK, đây là câu trả lời cho những gì tôi hỏi (từ câu trả lời của Eric): http://blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why-do-we-need-a-syntax-at-all.aspx

Đầu tiên, có vẻ như với tôi rằng sai nên được một cái gì đó mà bạn cố tình thiết kế vào giao diện hoặc của bạn đại biểu. Làm cho nó chỉ bắt đầu xảy ra mà không có sự kiểm soát của người dùng hoạt động dựa trên mục tiêu đó và cũng có thể có thể giới thiệu các thay đổi đột phá. (Xem thêm trên những người trong một bài sau!)

Làm như vậy Automagically cũng có nghĩa là như quá trình phát triển đi lên và phương pháp được bổ sung vào giao diện, các sai của giao diện có thể thay đổi bất ngờ. Điều này có thể giới thiệu thay đổi bất ngờ và sâu rộng ở nơi khác trong chương trình.

Tôi quyết định đặt nó rõ ràng ở đây vì mặc dù liên kết của anh ấy không có câu trả lời cho câu hỏi của tôi, bản thân bài đăng không có.

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