0

我有一个无法在 Visual Studio 中构建的程序集的 C# 代码。经过一番研究,我发现所有这些错误都是由 <、> 和 $ 符号引起的。分析 .NET 反射器中的程序集发现这些代码部分是由编译器创建的。这是一些带有这些错误的代码

    private System.Collections.IEnumerator Register(string name, string password, string password2, string email)
{
    LoginFengKAI.<Register>c__Iterator2 <Register>c__Iterator = new LoginFengKAI.<Register>c__Iterator2();
    <Register>c__Iterator.name = name;
    <Register>c__Iterator.password = password;
    <Register>c__Iterator.password2 = password2;
    <Register>c__Iterator.email = email;
    <Register>c__Iterator.<$>name = name;
    <Register>c__Iterator.<$>password = password;
    <Register>c__Iterator.<$>password2 = password2;
    <Register>c__Iterator.<$>email = email;
    <Register>c__Iterator.<>f__this = this;
    return <Register>c__Iterator;
}

在这里,每次使用 < 和 > 符号都会出现两个错误,而每次使用 <、$ 和 > 符号<Register>都会出现三个错误。<$>您认为可能导致这些错误的原因是什么?

4

1 回答 1

3

从外观上看,您正在使用迭代器块 - C# 2.0 引入的一种语言。

迭代器块是语法糖。当编译器遇到迭代器块时,它将应用句法映射,这将扩展迭代器块以在内部变得更复杂。当您在反汇编程序中打开程序集时,您看到的是句法映射的产物。

编译器不希望您能够引用此编译器生成的代码(因为它会令人困惑并且有潜在的危险/冲突),因此它为生成的标识符提供了不可描述的名称,否则这些名称在 C# 中是无效的。

总而言之,<、> 和 $ 符号在 C#无效,但在 IL 中无效(反汇编程序将最好地尝试从中准确重构源代码)。

于 2014-08-09T08:57:21.277 回答