关于C#中for循环的循环表达,我有一个很好的问题。
我总是喜欢学习和扩展我的知识,因此我经常使用反射器来寻找和学习其他知识。最近我在装配中四处寻找,我认为这是一个C#装配。
我遇到了这个:
public virtual void DoRows(Parse rows)
{
for (; rows != null; {
Parse more;
rows = more;
}
)
{
more = rows.More;
this.DoRow(rows);
}
}
我从来不知道我可以在循环表达式中使用代码块。所以我启动了MSDN并查看了C#的语言参考但没有找到任何内容。
C ++参考显示了一些有趣的东西(http://msdn.microsoft.com/en-us/library/b80153d8.aspx),但我不是一个C ++开发者,我有一种强烈的感觉,这个组件不是用C ++编写。
dotPeek说该程序集是一个v4.0.30319 / msil程序集。
现在有以下问题: - 这是C ++还是C#代码构造?! - 我们可以在C#中做这样的事吗?
我无法重现看起来像这样的代码并在VS2010中编译。
@edit:更改了代码构造中的单词assembly。
@edit II:谢谢你的所有答案。我认为这是dotPeek反射器中的一个错误,或者我们发现了一些for-loop-expression复活节彩蛋。这就是Red Gate对同一方法所说的话:
public virtual void DoRows(Parse rows)
{
while (rows != null)
{
Parse more = rows.More;
this.DoRow(rows);
rows = more;
}
}
答案 0 :(得分:2)
没有C ++或C#程序集这样的东西。编译代码后,它就是ILCode。反射器使用此ILCode并将其反编译为您选择的语言。
这可能导致代码在ILCode中有效,但在目标语言中无效。
答案 1 :(得分:0)
编译到IL是一个多对一的操作,反编译器有关于他们在反编译时选择的众多选择中的哪一个的规则。通常,不同语言产生的IL不可能直接以另一种语言再现。
在这种情况下,反编译器选择不好并且生成的C#无效(反编译器中的错误),或者它无法将代码反编译成等效的C#。