.net 为什么内置应用程序的行为与2010 v.s.和2012有所不同?

.net 为什么内置应用程序的行为与2010 v.s.和2012有所不同?,.net,visual-studio-2010,visual-studio-2012,.net,Visual Studio 2010,Visual Studio 2012,我正在检查在我们的构建机器上安装.NET4.5是否会更改VS2010生成的输出IL映像 因为我知道foreach的行为在.NET4.5中已经发生了变化,以避免由于以下原因而导致的问题,所以我选择了一个展示这种行为的简单应用程序 class Program { private static void Main(string[] args) { var contents = new List<Func<int>&g

我正在检查在我们的构建机器上安装.NET4.5是否会更改VS2010生成的输出IL映像

因为我知道foreach的行为在.NET4.5中已经发生了变化,以避免由于以下原因而导致的问题,所以我选择了一个展示这种行为的简单应用程序

  class Program
    {
        private static void Main(string[] args)
        {
            var contents = new List<Func<int>>();
            var s = new StringBuilder();

            int[] values = new int[] { 4, 5, 6 };

            foreach (int value in values)
            {
                contents.Add(() => value);
            }

            for (var k = 0; k < contents.Count; k++)
                s.Append(contents[k]());

            Console.WriteLine(s);
        }
类程序
{
私有静态void Main(字符串[]args)
{
var contents=新列表();
var s=新的StringBuilder();
int[]值=新的int[]{4,5,6};
foreach(值中的int值)
{
内容。添加(()=>值);
}
for(var k=0;k
与2010年产量之比:666

与2012年产量之比:456

我在VS2010中创建了一个控制台应用程序,在VS2012中创建了一个具有相同代码的控制台应用程序(都是针对.NET4的)

但是,这两个控制台应用程序根据其生成的IDE表现出不同的行为。在生成输出中,我检查了这两个应用程序是否具有几乎相似的生成参数。因此我想知道最终可执行文件如何表现出不同的行为?.NET 4.5是就地升级,因此两个IDE的编译器必须相同

注意:我确实看了一个相关的问题:但它没有回答我关于为什么可执行行为不同的问题

编辑1: 如前所述,我确实尝试在VS2010命令提示符下使用VS2010的输出窗口中的命令行构建代码。生成的输出的行为就像是使用VS2012构建的一样

编辑2:

我正在输出窗口中发布输出:

VS 2010: 建造开始于2012年12月20日晚上11:04:56

CoreClean:创建目录“obj\x86\Debug\”。 GenerateTargetFrameworkMonitorAttribute:正在跳过目标 “GenerateTargetFrameworkMonitorAttribute”,因为所有输出文件都是 输入文件的最新版本。CoreComile:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe/noconfig /nowarn:17011702/nostlib+/platform:x86/errorreport:prompt/warn:4 /定义:调试;跟踪/errorendlocation/preferreduilang:en US /highentropyva-/reference:“C:\Program Files(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\Microsoft.CSharp.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.Core.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.Data.DataSetExtensions.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.Data.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.Xml.dll“ /参考:“C:\ProgramFiles(x86)\reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Xml.Linq.dll“ /调试+/debug:full/filealign:512/优化- /输出:obj\x86\Debug\TestConsoleApp.exe/target:exe/utf8output Program.cs Properties\AssemblyInfo.cs C:\Users\105044960\AppData\Local\Temp.NETFramework,Version=v4.0.AssemblyAttributes.cs _CopyAppConfigFile:跳过目标“\u CopyAppConfigFile”,因为所有输出文件相对于输入文件都是最新的。 CopyFilesToOutputDirectory:正在从复制文件 “obj\x86\Debug\TestConsoleApp.exe”改为“bin\Debug\TestConsoleApp.exe”。 TestConsoleApp->C:\Users\105044960\Documents\Visual Studio 2010\Projects\TestConsoleApp\TestConsoleApp\bin\Debug\TestConsoleApp.exe 将文件从“obj\x86\Debug\TestConsoleApp.pdb”复制到 “bin\Debug\TestConsoleApp.pdb”

VS 2012:

1> CoreClean:1>删除文件“c:\users\105044960\documents\visual 演播室 11\Projects\TestConsoleApp\TestConsoleApp\bin\Debug\TestConsoleApp.exe”。 1> 正在删除文件“c:\users\105044960\documents\visual studio” 11\Projects\TestConsoleApp\TestConsoleApp\bin\Debug\TestConsoleApp.pdb”。 1> 正在删除文件“c:\users\105044960\documents\visual studio” 11\Projects\TestConsoleApp\TestConsoleApp\obj\Debug\TestConsoleApp.csprojResolveAssemblyReference.cache”。 1> 正在删除文件“c:\users\105044960\documents\visual studio” 11\Projects\TestConsoleApp\TestConsoleApp\obj\Debug\TestConsoleApp.exe”。 1> 正在删除文件“c:\users\105044960\documents\visual studio” 11\Projects\TestConsoleApp\TestConsoleApp\obj\Debug\TestConsoleApp.pdb”。 1> GenerateTargetFrameworkMonitorAttribute:1>跳过目标 “GenerateTargetFrameworkMonitorAttribute”,因为所有输出文件都是 输入文件的最新版本。1>CoreComile:1> C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe/noconfig /nowarn:170117022008/nostlib+/platform:AnyCPU/errorreport:prompt /警告:4/定义:调试;跟踪/errorendlocation/preferreduilang:en US /highentropyva-/reference:“C:\Program Files(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\Microsoft.CSharp.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.Core.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.Data.DataSetExtensions.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.Data.dll“ /参考:“C:\ProgramFiles(x86)\reference 程序集\Microsoft\Framework.NETFramework\v4.0\System.dll“ /参考:“C:\ProgramFiles(x86)\
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
foreach (int value in values)
{
    // ...
}
{
    int value;
    for (/* iteration */)
    {
        value = /* get from enumerator */;
        // ...
    }
}
for (/* iteration */)
{
    int value = /* get from enumerator */;
    // ...
}
foreach (int value in values)
{
    int newValue = value;
    // ...
}
foreach (V v in x) embedded-statement
{
  E e = ((C)(x)).GetEnumerator();
  try {
      V v;
      while (e.MoveNext()) {
          v = (V)(T)e.Current;
          embedded-statement
      }
  }
  finally {
      … // Dispose e
  }
}
foreach (V v in x) embedded-statement
{
  E e = ((C)(x)).GetEnumerator();
  try {
      while (e.MoveNext()) {
          V v = (V)(T)e.Current;
          embedded-statement
      }
  }
  finally {
      … // Dispose e
  }
}