2010-06-28 36 views
7

Ví dụ:Lambda biến phạm vi

myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh"); 

var s = "s"; 

Một biến "s" được định nghĩa trong một lambda và biến khác "s" như là một biến địa phương trong cùng một phương pháp. Visual Studio cho tôi biết "Một biến xung đột được định nghĩa bên dưới" khi tôi di chuột qua "s" đầu tiên. Tại sao những xung đột này lại xảy ra; "s" trong lambda không có sẵn bên ngoài các dấu ngoặc kèm theo của nó chắc chắn?

+0

Xem: http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are -not-so-simple.aspx –

Trả lời

8

Chúng xung đột vì quy tắc C# là không thể sử dụng hai cách sử dụng cùng một tên đơn giản để tham chiếu đến hai thứ khác nhau bên trong khối ngay lập tức bao quanh một trong hai. Trong ví dụ của bạn, tên đơn giản "s" được sử dụng để có nghĩa là hai thứ bên trong khối bao quanh khai báo biến cục bộ: nó có nghĩa là một biến cục bộ và một tham số lambda. Điều đó là điều bất hợp pháp. Tôi lưu ý rằng các thông báo lỗi bạn nhận được sẽ cho bạn biết điều này:

 
A local variable named 's' cannot be declared in this scope because it 
would give a different meaning to 's', which is already used in a 
'child' scope to denote something else 

C# không cho phép bạn có tên đơn giản tương tự có nghĩa là hai điều trong cùng một khối bởi vì làm như vậy làm cho mã dễ gây lỗi, khó có thể chỉnh sửa, cứng để đọc, khó để tái cấu trúc và khó gỡ lỗi. Nó là tốt hơn để không cho phép thực hành lập trình xấu này hơn để cho phép nó và nguy cơ bạn gây ra lỗi bởi vì bạn giả định rằng "s" có nghĩa là cùng một điều trong suốt khối.

Khi mã chỉ dài hai dòng, bạn có thể dễ dàng nhớ rằng có hai nghĩa khác nhau cho s, nhưng khi nó dài hàng trăm dòng, không dễ dàng như vậy.

Để biết thêm thông tin về quy định này, xem:

http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx

+0

hmm, tôi nhớ điều gì đó về bài đăng của bạn. Cảm ơn vì đã sửa tôi. –