我有一个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中不是(这是反汇编器最好的-尝试准确地重建源代码)。