我正在重读 Nutshell 中的 c# 5.0 中有关捕获迭代变量的部分(第 138 页),并且我尝试在 c# 4.0 和 c# 5.0 上重现以下代码,但直到现在才希望发现差异
using System;
class Test
{
static void Main()
{
Action[] actions = new Action[3];
int i = 0;
foreach (char c in "abc")
actions[i++] = () => Console.Write(c);
for (int j = 0; j < 3; j++)
{
actions[j]();
}
foreach (Action a in actions) a();
Console.ReadLine();
}
}
Note
我有 Visual studio 2012(安装了 .net 4.0 和 4.5),并且在尝试重现问题时更改了目标框架
Update为了更多地解释这个问题,c# 4.0 的输出将与 c# 5.0 不同
我知道由于更新到最新版本的 C# 编译器,这可能不太有用
谁能告诉我如何重现这个问题?
您无法重现它,因为您正在更改 .Net 框架的版本,但没有更改编译器。您始终使用 C# v5.0,它解决了以下问题foreach
循环。你可以看到这个问题for
但循环:
Action[] actions = new Action[3];
int i = 0;
for (int j = 0; j < "abc".Length; j++)
actions[i++] = () => Console.Write("abc"[j]);
for (int j = 0; j < 3; j++)
{
actions[j]();
}
foreach (Action a in actions) a();
Console.ReadLine();
要使用旧的编译器,您需要旧的 VS 版本。在这种情况下,查看您的代码中断foreach
你需要在VS 2010中测试它(我是在本地测试的)。
您可能想尝试更改编译器的语言版本(正如 xanatos 在评论中建议的那样),但这并不使用旧的编译器。它使用相同的编译器,但限制您使用特定功能:
因为每个版本的 C# 编译器都包含对语言规范的扩展,/langversion
不提供与早期版本的编译器等效的功能。
From /langversion(C# 编译器选项)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)