Tại sao thông số của tôi x
hoạt động quá thất thường?Phạm vi Lambda Làm rõ
- Ví dụ 1 - Không tồn tại trong ngữ cảnh hiện tại.
- Ví dụ 2 - Không thể sử dụng lại
x
vì được xác định trong phạm vi 'trẻ em'. - Ví dụ 3 - Tốt. Đây là phần tôi bối rối. Có lẽ một phạm vi 'trẻ em' khác nhau?
Ví dụ 1:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var result = list.Where(x => x < 3);
Console.Write(result.ElementAt(x));
tạo biên dịch này thời gian lỗi:
The name 'x' does not exist in the current context
mà tôi mong đợi.
Ví dụ 2:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
var result = list.Where(x => x < 3);
int x = 1;
Console.Write(result.ElementAt(x));
sản xuất lỗi thời gian biên dịch này:
A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a 'child' scope to denote something else
tôi hiểu Phạm vi như đã trả lời trong câu hỏi này, Is there a reason for C#'s reuse of the variable in a foreach?. Tuy nhiên, đây là điều tôi chưa bao giờ thấy trước đây. Ngoài ra, nó làm cho câu trả lời cho câu hỏi này, What is the scope of a lambda variable in C#?, không đầy đủ hoặc sai.
Ví dụ 3:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
List<string> stringList = new List<string> { "A", "B" };
var result = list.Where(x => x < 3);
var result2 = stringList.Where(x => x != "A");
Console.Write(result2);
Không có lỗi sản xuất.
Với câu trả lời được chấp nhận, những bài đăng trên blog này từ Eric Lippert đã giúp tôi thu hút sự chú ý của mình về những gì đang diễn ra. Nếu ai vẫn còn bối rối:
[Đây] (http://blogs.msdn.com/b/ericlippert/archive/2009/11/02 /simple-names-are-not-so-simple.aspx) là hai [liên kết] có liên quan (http://blogs.msdn.com/b/ericlippert/archive/2009/11/05/simple-names-are- không-so-đơn giản-part-two.aspx) về chủ đề này. – Servy
có thể trùng lặp của [phạm vi biến cục bộ trong phương thức ẩn danh linq (đóng)] (http://stackoverflow.com/questions/10517964/local-variable-scope-in-linq-anonymous-method-closure) – Magnus
bản sao có thể có của [ Phạm vi của biến lambda trong C# là gì? (Http://stackoverflow.com/questions/10494074/what-is-the-scope-of-a-lambda-variable-in-c) – nawfal