2013-09-05 38 views
7

Tôi đã thực thi mã sau đây với C# 3.5 và 4.0. Kết quả hoàn toàn khác nhau.Sự khác biệt trong kết quả truy vấn LINQ trong .NET 3.5 và 4.5

static void Main() 
    {  
     int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
     List<IEnumerable<int>> results = new List<IEnumerable<int>>(); 

     foreach (var num in numbers) 
     { 
      results.Add(numbers.Where(item => item > num)); 
     } 

     foreach (var r in results) 
     { 
      Console.WriteLine("{0}", r.Count()); 
     }   
    } 

Với Microsoft (R) Visual C# 2008 Phiên bản trình biên dịch 3.5.30729.5420 đầu ra là 0 0 0 0 0 0 0 0 0 0.

Nhưng với Microsoft (R) Visual C# Phiên bản trình biên dịch 4.0.30319.17929 đầu ra là 9 8 7 6 5 4 3 2 1 0.

Tôi có một ý tưởng mờ nhạt rằng điều này là do thực thi trì hoãn hoặc đánh giá lười biếng nhưng chưa hiểu rõ cách thức chịu trách nhiệm về các kết quả đầu ra khác nhau tại đây.

Chỉnh sửa: Xin lỗi, đó là .NET 3.5 và 4.5 và cũng đã thêm phiên bản trình biên dịch Vui lòng giải thích.

+2

Tôi nhận được cùng một kết quả trong 3.5 và 4.0, {9 8 7 ...} bạn có chắc chắn bạn không làm điều gì đó khác biệt? –

+0

Nó cho tôi kết quả tương tự .... – Habib

+3

Tôi tin rằng sự thay đổi này xảy ra với 4.5, không phải 4.0. –

Trả lời

7

Vì C# 5, biến vòng lặp trong foreach được biên dịch sao cho nó tồn tại trong phạm vi vòng lặp chứ không nằm ngoài phạm vi đó.

Điều này có nghĩa là khi bạn đóng biến vòng lặp, bạn sẽ nhận được các kết quả khác nhau.

Here's what Eric Lippert phải nói về vấn đề ban đầu.

+6

Đó là kể từ C# 5.0, không .NET 4.0. – Servy

+0

Gotcha. Cảm ơn. – spender

+1

Điều này không trả lời được câu hỏi. OP yêu cầu trong C# 4.0. nhưng bạn đang dùng C# 5.0 –

6

Bạn đã truy cập một biến bên trong một đóng, do đó kết quả sẽ khác nhau trên các phiên bản khác nhau của trình biên dịch.

Trong C# 5.0, biến được định nghĩa lại trong mỗi lần lặp của vòng lặp, trong khi các phiên bản C# trước đó chỉ được xác định một lần.

Mọi chi tiết, thấy lớn blog post

đáng chú ý hơn, đoạn mở đầu Eric Lippert của:

UPDATE: Chúng tôi đang thay đổi phá vỡ. Trong C# 5, biến vòng lặp của một foreach sẽ được logic bên trong vòng lặp, và do đó đóng cửa sẽ đóng trên một bản sao mới của biến mỗi lần. Vòng lặp "for" sẽ không bị thay đổi. Chúng tôi sẽ trả lại bạn ngay cho bài viết gốc của chúng tôi.

+1

Phạm vi của biến có * không có gì * để làm với phiên bản .NET. Nó có tất cả mọi thứ để làm với các phiên bản của C#. Nó đã được thay đổi trong C# 5.0. – Servy

+0

Bạn đã đọc blog của eric 'Chúng tôi đang thực hiện thay đổi đột phá. Trong C# 5' –

+0

@Servy Vâng tôi đã làm rõ điều đó, cảm ơn. – mattytommo

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