2012-02-16 21 views
19
//ok 
Action<int> CallbackWithParam1 = delegate { };  

//error CS1593: Delegate 'System.Action<int>' does not take 0 arguments 
Action<int> CallbackWithParam2 =() => { }; 

Chỉ cần tự hỏi tại sao sự khác biệt thực sự. : -/Tại sao các đại biểu vô danh bỏ qua các đối số, nhưng lambdas không thể?

+0

Thật không may, không có lý do chính đáng nào cho nó, như @JaredPar nói dưới đây. Chỉ là một cái gì đó đã bị bỏ qua (cho dù cố ý hay không, tôi không chắc chắn). –

+12

Điều này trông giống như một công việc cho ... Eric Lippert người đàn ông! – Tudor

+1

@Tudor Chèn Batman chủ đề ở đây. –

Trả lời

16

Jared dĩ nhiên là đúng. Để thêm một vài chi tiết khác:

  • Hầu như không ai sử dụng cú pháp "bỏ qua danh sách tham số".
  • Chúng tôi không có kịch bản cho lambdas rằng yêu cầu tính năng đó.
  • Tính năng này làm phức tạp loại suy luận và độ phân giải quá tải và khiến cho nhiều khả năng cả hai sẽ không thành công.
  • Bạn muốn cú pháp nào cho đối tượng địa lý? Action<int> c = => {}; ??? Tôi không có mong muốn gì để làm cho => trở thành một toán tử tiền tố đơn nhất.

Vì vậy, một mặt chúng ta có danh sách các ưu:

  • Lambdas tăng phù hợp với một không cần thiết tính năng C# 2.0 mà hầu như không ai biết về hoặc sử dụng - một tính năng mà thẳng thắn, chúng tôi mong muốn chúng tôi 'd không bao giờ thực hiện ở nơi đầu tiên

và nhược điểm:

  • thực hiện phức tạp loại đã phức tạp trong các thuật toán phân giải quá tải và lên men
  • tính năng dẫn đến nhiều khả năng lỗi hơn cho người dùng không có quyền lợi tương ứng trong quyền biểu diễn.
  • không có cú pháp rõ ràng là tốt đẹp

Nếu bạn được cung cấp danh sách ưu và khuyết điểm đó, bạn sẽ làm gì? Tôi hy vọng "triển khai tính năng" sẽ không phải là lựa chọn của bạn; nó không phải của chúng ta.

+4

"Hầu như không ai sử dụng cú pháp 'bỏ qua danh sách tham số'." Heck, tôi thậm chí không biết nó tồn tại. – BoltClock

+3

"hầu như không ai biết về hoặc sử dụng" ... Và tôi đã nhìn thấy cú pháp đó cho các đại biểu _event_, như trong 'button1.Click + = delegate {MessageBox.Show (" Hello world "); }; '. Nó thậm chí còn được đề xuất bởi hai người khác nhau để trả lời cho câu hỏi của riêng tôi (http://stackoverflow.com/questions/7530743/c-sharp-add-event-handler-literal-code-block). Bạn có thực sự xem xét một trường hợp khác không? –

+6

Tuyệt! Có vẻ tôi có thể triệu hồi Eric Lippert! – Tudor

6

Về bản chất, đơn giản vì chúng là các tính năng khác nhau với các tập hợp kịch bản được hỗ trợ khác nhau. Nó gần giống như yêu cầu

Tại sao lambdas có thể là biểu thức nhưng đại biểu chỉ có thể chặn?

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