7

używam .NET 4 (nie .NET 4.5 lub jakąkolwiek inną wersję ram!)Dlaczego różne wersje programu Visual Studio będą wyświetlać różne wyniki tego samego kodu?

Dlaczego różne wersje Visual Studio wyjściowy będzie innego wyniku tego samego kodu z wykorzystaniem SAME .NET Framework?

Mam następujący

static void Main(string[] args) 
{ 
    var values = new List<int>() { 1, 2, 3, 4, 5 }; 
    var funcs = new List<Func<int>>(); 

    foreach (var v in values) { 
     funcs.Add(() => v * 10); 
    } 

    foreach (var f in funcs) { 
     Console.WriteLine(f()); 
    } 

    Console.ReadKey(); 
} 

W Visual Studio wyjście jest 10 20 30 40 50 (target .NET v == 4).
W programie Visual Studio dane wyjściowe to 50 50 50 50 50 (docelowy .NET v == 4).

Gdzie jest problem? Jak zidentyfikować C# (nie .NET!) Wersja używana przez każdego Studio dla .NET 4

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319> csc /?
Microsoft (R) Visual C# Compiler wersja 4.0.30319.33440
Microsoft (R) .NET Framework 4.5

C: \ Program Files (x86) \ Microsoft Visual Studio 10,0 \ VC> csc /?
Microsoft (R) Visual C# wersja kompilatora 4 .0.30319.33440
Microsoft (R) .NET Framework 4.5

C: \ Program Files (x86) \ Microsoft Visual Studio 12,0> csc/?
Microsoft (R) Visual C# Compiler wersja 12 .0.30110.0
dla C# 5

EDIT

mogę powiedzieć, że

VS 2010 == C# 4 
VS 2013 == C# 5 

i to niezależnie od docelowa struktura konkretnego rozwiązania?

+0

Wyświetlam wyjście 'csc /?' Na mojej maszynie – serhio

+0

Myślę, że jest to wyjaśnione w [Czy zmieniono użycie zmiennych w C# 5?] (Http://stackoverflow.com/questions/12112881/has- foreachs-use-of-variables-was-changed-in-c-sharp-5). –

+0

@Habib nie jest duplikatem. moim pytaniem jest ** dlaczego różne Visual Studio targetowania tego samego .Net daje inny wynik ** – serhio

Odpowiedz

9

Od Eric Lippert na blog post:

W języku C# 5, zmienna pętla foreach będzie logicznie wewnątrz pętli i dlatego zamknięcia zamknie ponad świeżej kopii zmiennej za każdym razem .

I cytat z MSDN:

Visual Studio 2010 nie pozwoli Ci rozwinąć przy użyciu C# 5.Nowe funkcje językowe C# 5 są częścią kompilatora i będą zawarte w kompilatorze Visual Studio 2012 w postaci . Nawet jeśli zainstalujesz .NET 4.5, ten nie pozwoli ci korzystać z nowych funkcji języka (takich jak async/await), ponieważ wymagają one użycia nowego kompilatora.

VS2013 działa tylko C# 5.0 kompilator i można kierować różne ramy .NET. Z tego powodu uzyskuje się funkcje C# 5.0, takie jak async/await i nadal docelowy .NET 4.0.

+0

Kiedy celuję w VS ** 2013 ** w ** .NET 4 ** framework, używa także kompilatora C# 5? – serhio

+3

@serhio: Tak, racja. VS2013 działa tylko z kompilatorem C# 5.0 i możesz kierować reklamy na różne platformy .NET. Z tego powodu korzystasz z funkcji C# 5.0, takich jak 'async/await' i nadal celuj w .NET 4.0. – YK1

+1

Dodano komentarz do odpowiedzi, bardzo istotne. – Ofiris

Powiązane problemy