Почему невозможно получить имена локальных переменных с помощью Reflection?

Если у меня есть такой код:

public class Program
{
    public static void Main()
    {
        string bar = "";
        int foo = 24;
    }
}

Я могу получить локальные переменные, объявленные вMain с помощью:

var flag = BindingFlags.Static | BindingFlags.Public;
var fields = typeof(Program).GetMethod("Main", flags).GetMethodBody().LocalVariables;

Это возвращаетIList<LocalVariableInfo> иLocalVariableInfo имеет только три свойства:IsPinned,LocalIndex а такжеLocalType.Так нетName свойство существует.

Что мне интересно, так это то, что вы можете видеть имена переменных в сгенерированномIL code:

.method public hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       11 (0xb)
  .maxstack  1
  .locals init ([0] string bar,
           [1] int32 foo)
  IL_0000:  nop
  IL_0001:  ldstr      ""
  IL_0006:  stloc.0
  IL_0007:  ldc.i4.s   24
  IL_0009:  stloc.1
  IL_000a:  ret
} // end of method Program::Main

но невозможно получить их используяReflectionЭто потому, что локальные переменные не имеют имени и доступ к ним осуществляется только по их индексам (если да, то какILDASM.exe показывает имена?) или потому что такая функция не реализована? Или, если это возможно, используя другой способ, то вопрос будеткак?

Примечание: я видел некоторые вопросы, такие какэтот и большинство из них используетExpressions чтобы получить имя переменной. Это не работает, если я хотел бы получить все локальные переменные, включая временные переменные, сгенерированные компилятором.

Ответы на вопрос(4)

Ваш ответ на вопрос