4

我对 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:更改了代码结构中的组装一词。

@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;
    }
}
4

2 回答 2

2

没有 C++ 或 C# 程序集之类的东西。代码编译完成后,就是 ILCode。反射器获取此 ILCode 并将其反编译为您选择的语言。

这可能导致代码在 ILCode 中有效,但在目标语言中无效。

于 2012-06-27T13:26:31.737 回答
0

编译为 IL 是一个多对一的操作,反编译器在反编译时有关于他们选择的众多选项中的哪一个的规则。通常,不同的语言会产生无法直接用另一种语言重现的 IL。

在这种情况下,反编译器选择不当并且生成的 C# 无效(反编译器中的错误),或者它无法将代码反编译成等效的 C#。

于 2012-06-27T13:25:56.657 回答