Một lambda như (int a) => a
sẽ phù hợp với bất kỳ đại biểu nào có số int
và trả lại int
. Func<int,int>
chỉ là một ví dụ duy nhất, và bạn có thể dễ dàng khai báo một mình với delegate int Foo(int x);
. Trong thực tế, biểu thức lambda này thậm chí sẽ phù hợp với một đại biểu mất int
và trả về một double
, bởi vì kết quả của lambda (a
) được chuyển đổi hoàn toàn thành double
.
Để một lambda được gán cho tất cả các loại đại biểu mà nó sẽ phù hợp, bản thân lambda vốn không có kiểu. Thay vào đó, nó sẽ đưa vào loại đại biểu bạn đang sử dụng, miễn là có thể. ((int a) => a
không thể được gán cho Func<byte, byte>
tất nhiên.)
Trong khi cả hai Func<int, int>
và Foo
đại biểu tôi xác định tất nhiên có thể được chuyển đổi sang Delegate
, một lambda không thể chuyển đổi trực tiếp với Delegate
vì nó là không rõ ràng những gì thực tế của nó chữ ký sẽ là. Sau Delegate d = (int a) => a
, sẽ d
là Foo
hoặc Func<int, int>
hoặc thậm chí Func<int, double>
? Tất cả đều là những khả năng hợp lệ, và trình biên dịch không biết bạn định làm gì. Nó có thể đoán tốt nhất, nhưng C# không phải là loại ngôn ngữ thực hiện loại phỏng đoán đó. Đây cũng là lý do tại sao bạn không thể làm điều gì đó như var = (int a) => a
.
Tôi nghĩ rằng các thông báo lỗi rằng trình biên dịch cung cấp cho cho Delegate d = (int a) => a;
là rất rõ ràng:
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
trực giác bạn sẽ nghĩ Delegate
là một loại đại biểu, nhưng đó không phải là cách làm việc. :)
Fyi, Bất cứ khi nào một cái gì đó không biên dịch, đọc (và đăng) thông báo lỗi là tốt. –
@SharePoint Người mới: Vui lòng xem bài đăng cập nhật của tôi. Điều đó sẽ giải quyết lỗi của bạn ngay bây giờ. – Noldorin