Tôi đã xác định các loại đại biểu sau. Một trả về một chuỗi, và một một đối tượng:Tại sao ví dụ sau đây sử dụng hiệp phương sai trong các đại biểu không biên dịch?
delegate object delobject();
delegate string delstring();
Bây giờ xem xét đoạn mã sau:
delstring a =() => "foo";
delobject b = a; //Does not compile!
Tại sao việc chuyển nhượng không hợp lệ?
Tôi không hiểu. Phương thức trả về một chuỗi nên được xem xét một cách an toàn như một phương thức trả về một đối tượng (vì một chuỗi là một đối tượng).
Trong C# 4.0, ví dụ sau hoạt động. Thay vì sử dụng các đại biểu, tôi sử dụng Func<TResult>
kiểu chung chung:
Func<string> a =() => "foo";
Func<object> b = a; //Perfectly legal, thanks to covariance in generics
Ngoài ra: nếu tôi viết lại nó như vậy, nó hoạt động:
delobject b =() => a();
Nhưng đây không phải là điều tương tự như những gì tôi muốn ban đầu . Bây giờ tôi đã tạo ra một phương pháp mới gọi một phương thức khác.
Nó không chỉ là một bài tập, như trong ví dụ này:
delint a =() => 5;
delobject b = a; //Does not work, but this is OK, since "int" is a value type.
delobject b =() => a(); //This will box the integer to an object.
Làm thế nào nó sẽ có tác dụng nếu các đại biểu chấp nhận các thông số? Tôi đoán cho sự nhất quán các nhà thiết kế ngôn ngữ quyết định các quy tắc nên giống nhau khi không có tham số. – JohnLBevan
@JohnLBevan Cùng một cách? 'Func' hoàn toàn có thể được gán cho một 'Func '. –
hvd
"Thay vì sử dụng đại biểu" không hoàn toàn chính xác, vì 'Func' là loại ** ủy quyền chung **. –