Не удалось скомпилировать код из-за символов <,> и $
У меня есть 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>
для использования символов <и> и трех ошибок для каждого <$>
для использования символов <, $ и>. Как вы думаете, что может вызвать эти ошибки?
1 ответ
Судя по всему, вы используете блок итератора - язык, представленный в C# 2.0.
Блоки итераторов являются синтаксическим сахаром. Когда компилятор сталкивается с блоком итератора, он применяет синтаксическое отображение, которое расширяет блок итератора, чтобы внутренне что-то усложнить. Когда вы открываете свою сборку в дизассемблере, вы смотрите на продукт синтаксического сопоставления.
Компилятор не хочет, чтобы вы могли ссылаться на этот код, сгенерированный компилятором (так как он может быть запутанным и потенциально опасным / конфликтным), поэтому он дает сгенерированным идентификаторам неописуемые имена, которые в противном случае были бы недопустимыми в C#.
Таким образом, символы <,> и $ недопустимы в C#, но не в IL (именно из этого дизассемблер будет лучше всего пытаться точно восстановить исходный код).