Tôi tò mò tại sao C# cho phép tôi bỏ qua các tham số ủy nhiệm trong một số trường hợp nhưng không phải là các thông số khác.Tôi có thể bỏ qua các tham số ủy nhiệm bằng cú pháp lambda không?
Đối với trường hợp này được phép:
Action<int> action = delegate { Console.WriteLine("delegate"); };
nhưng đây không phải là:
Action<int> action =() => Console.WriteLine("lambda");
Có cách nào để khởi tạo một delegate và bỏ qua các thông số sử dụng một lambda? Tôi biết rằng tôi có thể thêm một tham số duy nhất vào lambda và sửa chữa dòng trước nhưng đây là một câu hỏi học thuật liên quan đến trình biên dịch và tại sao hoặc cách thức hoạt động của nó.
Cho dù điều này là đúng hay không phụ thuộc vào cách bạn đọc câu trả lời. IL được tạo ra là * chắc chắn * chỉ cho một phương thức lấy một int. Trình biên dịch * có * để biết loại thời gian biên dịch nó đang cố gắng chuyển đổi nó thành - nếu bạn thay đổi chữ ký của hành động thành "Ủy quyền", bạn sẽ nhận được một lỗi biên dịch thời gian. –
Ý tôi là (và tôi nghĩ) là bỏ qua danh sách tham số từ đại biểu trong mẫu đầu tiên, trình biên dịch "điền vào nó" khi tạo phương thức sao cho nó khớp với chữ ký cần thiết. Các biểu thức lambda không cho phép bạn bỏ qua danh sách tham số - một danh sách trống đưa vào một phương thức không có tham số - và do đó gây ra lỗi biên dịch. – tvanfosson
@JonSkeet mã sau đây biên dịch và thực hiện thành công ngay cả khi sử dụng định nghĩa đại biểu thay cho hành động - 'public delegate void MyFun (int i); void tĩnh riêng TestJonsArgument() { MyFun fun1 = delegate {Console.WriteLine ("Ví dụ không có tham số:" + 2); }; fun1.Invoke (20); } ' – RBT