Sử dụng Visual Studio 2013, tôi đang cố tạo lại hình ảnh xác thực được đề cập trong bài đăng trên blog của Eric Lippert "Closing over the loop variable considered harmful".Sao chép "đóng trên biến của một foreach" gotcha
Trong thuộc tính dự án, tôi đã chọn "C# 3.0" làm phiên bản ngôn ngữ (Xây dựng> Nâng cao ...). Hơn nữa, tôi đã chọn "Khuôn khổ .NET 3.5" làm khung mục tiêu, như thể tôi nghĩ điều này không cần thiết vì điều này chỉ liên quan đến ngôn ngữ.
Chạy mã của mình:
using System;
using System.Collections.Generic;
namespace Project1
{
class Class1
{
public static void Main(string[] args)
{
var values = new List<int>() { 100, 110, 120 };
var funcs = new List<Func<int>>();
foreach (var v in values)
{
funcs.Add(() => v);
}
foreach (var f in funcs)
Console.WriteLine(f());
}
}
}
sản lượng dự kiến:
120 120 120
đầu ra thực tế:
100 110 120
Như đã trả lời bởi Eric Lippert himself trong "Is there a reason for C#'s reuse of the variable in a foreach?":
Vòng lặp
for
sẽ không bị thay đổi và thay đổi sẽ không được "quay lại" thành phiên bản trước của C#. Do đó, bạn nên tiếp tục cẩn thận khi sử dụng thành ngữ này.
Tôi đang làm gì sai?
Khi nào mã thực sự sẽ bị ngắt? Tôi đoán nếu mã dựa trên một lỗi trong trình biên dịch cũ mà sau đó được cố định hoặc nếu trình biên dịch mới giới thiệu một lỗi. Có những tình huống khác mà điều này có thể hữu ích không? – xehpuk
@xehpuk: Tôi không chắc tôi hiểu câu hỏi của bạn. Nó chắc chắn là trường hợp mã dựa trên các lỗi trình biên dịch cố định sẽ phá vỡ bất kể giá trị của chuyển đổi langversion. Nhóm biên dịch sẽ cố gắng hết sức để duy trì khả năng tương thích ngược khi sửa lỗi nhưng không phải lúc nào cũng có thể. –
Bạn nói đúng, nó vẫn là trình biên dịch tương tự. Vì vậy, trường hợp sử dụng về cơ bản là một thành viên dự án có phiên bản trình biên dịch mới hơn nhưng không thể dễ dàng sử dụng phiên bản cũ hơn (vì ví dụ: anh/cô ấy đang sử dụng phiên bản mới hơn của VS không có tùy chọn đó vì bất kỳ lý do gì). – xehpuk