Như những người khác đã lưu ý, vấn đề là các loại đại biểu không phải là "kết cấu". Nghĩa là, họ không có sự tương đương dựa trên "cấu trúc" của họ.
Bây giờ, điều này được cho là một điều tốt cho một số loại.Nếu bạn có
struct MyRectangle { int x; int y; int width; int height; ... }
và
struct YourRectangle { int x1; int y1; int x2; int y2; ... }
rõ ràng nó sẽ là một sai lầm nếu cho phép các trường hợp MyRectangle được gán cho các biến của YourRectangle, chỉ vì cả hai đều bao gồm bốn ints. Các ngữ nghĩa của các int là khác nhau và do đó các loại không tương đương.
Điều tương tự cũng đúng với các đại biểu. Bạn có thể có
delegate int Pure(string x);
delegate int Func(string x);
trong đó chức năng "thuần" là một không có tác dụng phụ và cùng một đầu ra cho cùng một đầu vào. Vì mỗi Pure là một Func hợp lý, nhưng mỗi Func không nhất thiết phải là Pure, không nên có sự kết cấu cấu trúc giữa chúng.
Trong thực tế, hệ thống kiểu không hỗ trợ các khái niệm như "hàm thuần túy" rất tốt. Và trong thực tế, phần lớn các nỗ lực để chuyển đổi giữa các loại đại biểu là hoàn toàn an toàn: chuyển đổi từ một Func<int, bool>
thành Predicate<int>
và cứ tiếp tục như vậy.
Vì vậy, có hai thứ, một người nhìn về phía sau và một người đang nhìn về phía trước. Ngược lại: nếu chúng tôi phải làm lại tất cả, tôi nghĩ các đại biểu có lẽ sẽ được nhập cấu trúc trong CLI. Bạn không phải lúc nào cũng biết những tính năng nào sẽ hữu ích khi bạn thiết kế một khung công tác hoàn toàn mới, và các loại đại biểu phi cấu trúc trước đây hóa ra lại không hữu ích như dự đoán. Tiền đạo: Tôi hy vọng sẽ thấy nhiều tính năng hơn trong các phiên bản sau của CLR cho phép nhập nhiều cấu trúc hơn. Ví dụ, tính năng "no pia" trong C# 4 là tạo ra hai kiểu ngữ nghĩa và cấu trúc giống nhau, nhưng được định nghĩa trong các assembly khác nhau, hợp nhất một cách hợp lý về mặt cấu trúc.
Có vẻ như đó là một diễn viên tiềm ẩn từ đại biểu đến Hành động chứ không phải theo cách khác. Bạn có thể thử tạo một hoặc bạn chỉ có thể thay đổi 't = new Thread (doIt);' thành 't = new Thread (doIt.Invoke);' cho cùng một kết quả. –