Что означают эти обозначения с использованием угловых скобок?

Я читаю Async в C # 5.0, а раздел преобразования компилятора содержит этот фрагмент:

public Task<int> AlexsMethod()
{
    <AlexsMethod>d__0 stateMachine = new <AlexsMethod>d__0();
    stateMachine.<>4__this = this;
    stateMachine.<>t__builder = AsyncTaskMethodBuilder<int>.Create();
    stateMachine.<>1__state = -1;
    stateMachine.<>t__builder.Start<<AlexsMethod>d__0>(ref stateMachine);
    return stateMachine.<>t__builder.Task;
}

Есть две новые для меня нотации. Первый - <AlexsMethod>d__0. Второй - stateMachine.<>4__this. Ни то, ни другое не работает, когда я пробую их сам, поэтому подозреваю, что они предназначены только для компилятора. Но у меня проблемы с поиском дополнительной информации о том, что подразумевается под этой нотацией.


person Matthew    schedule 15.06.2013    source источник
comment
Кто-то однажды сделал сообщение на SO, показав многое из того, что сделал компилятор C # (в то время - который может быть изменен) - все случайные маленькие символы (например, 4 в 4__this), которые вы видите, имеют неявное значение. Изменить: вот оно: stackoverflow.com/questions/2508828/   -  person Tim S.    schedule 15.06.2013


Ответы (2)


В отличие от скобок, обозначающих универсальные символы (например, Task<int>), они не имеют особого значения. Это просто то, что генерирует компилятор - идентификаторы, которые действительны в IL, но не в C #.

person Tim S.    schedule 15.06.2013
comment
И код, который генерирует имена: здесь (заимствовано из этого ответа) - person mins; 06.07.2019

Когда вы используете лямбда-выражение, лямбда-выражение является анонимным методом. Но компилятор должен дать ему имя, поэтому эти методы генерируются компилятором и не читаются человеком.

person ntwo1980    schedule 15.06.2013