2012-04-19 38 views
8

Với mã mẫu sau:Chỉ định phương thức ẩn danh để ủy nhiệm sử dụng dấu ngoặc đơn cho lỗi trình biên dịch?

static void SomeMethod() 
{ 
    Action<int,int> myDelegate; 

    //... 

    myDelegate = delegate { Console.WriteLine(0); }; 
    myDelegate = delegate() { Console.WriteLine(0); }; // compile error 

} 

sự khác biệt giữa

myDelegate = delegate { Console.WriteLine(0); }; 

myDelegate = delegate() { Console.WriteLine(0); }; 

là gì?

Trong ví dụ này, câu lệnh thứ hai tạo ra lỗi biên dịch trong khi lệnh đầu tiên thì không.

Trả lời

21

Một phương pháp vô danh có cú pháp delegatetham số-list{tuyên bố danh sách}. Danh sách tham số là tùy chọn.

Nếu bạn bỏ qua danh sách tham số thì phương pháp ẩn danh tương thích với bất kỳ loại đại biểu nào mà thông số không được đánh dấu "hết" hoặc "ref".

Nếu bạn cung cấp danh sách tham số thì phải khớp chính xác với các loại thông số đại biểu.

Trong trường hợp đầu tiên của bạn, bạn bỏ qua nó và trong trường hợp thứ hai bạn đang cung cấp nhưng không khớp với thông số đại biểu. Vì vậy, delegate {} là hợp pháp và delegate (int i, int j) { } là hợp pháp, nhưng delegate() {} thì không.

Trong mọi trường hợp, bạn có thể sử dụng biểu thức lambda tốt hơn; nó là cú pháp phổ biến hơn trong mã mới: (i, j)=>{ };

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