编译代码失败,原因是<, >和$符号

本文关键字:符号 代码 失败 编译 | 更新日期: 2023-09-27 18:17:08

我有一个c#代码的程序集未能在visual studio中构建。经过一番研究,我发现所有这些错误都是由<,>和$符号引起的。在. 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>使用<和>符号,每个<$>使用<, $和>符号时出现三个错误。你认为是什么导致了这些错误?

编译代码失败,原因是<, >和$符号

从表面上看,你正在使用迭代器块——c# 2.0引入的一种功能语言。

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

编译器不希望你能够引用这个编译器生成的代码(因为它会混淆和潜在的危险/冲突),所以它给了生成的标识符不可说的名字,否则在c#中是无效的。

总之,<,>和$符号在c#中是无效的,但在IL中不是(这是反汇编器最好的-尝试准确地重建源代码)。