Как получить определение поля с открытым универсальным типом возврата из определения закрытого универсального типа?C#

Место общения программистов C#
Ответить
Anonymous
 Как получить определение поля с открытым универсальным типом возврата из определения закрытого универсального типа?

Сообщение Anonymous »

Сейчас я создаю небольшой игрушечный компилятор для языка .NET. Прямо сейчас я хочу реализовать сравнение кортежей. Вот что генерирует компилятор C#:

Код: Выделить всё

...
IL_0019: ldloc.3
IL_001a: ldfld !0 valuetype [System.Runtime]System.ValueTuple`3::Item1
IL_001f: ldloc.s 4
IL_0021: ldfld !0 valuetype [System.Runtime]System.ValueTuple`3::Item1
IL_0026: bne.un.s IL_0048
...
Как вы можете видеть в строке 2 (метка IL_001a), инструкция ldfld загружает поле из созданного универсального типа System.ValueTuple`3 , но тип возвращаемого значения по-прежнему !0, а не int32.
В настоящее время я использую следующий простой код, где tupleType — это сконструированный универсальный тип, как указано выше.

Код: Выделить всё

foreach (FieldInfo field in tupleType.GetFields())
{
il.Emit(OpCodes.Ldloc, tuple1Index);
il.Emit(OpCodes.Ldfld, field);

il.Emit(OpCodes.Ldloc, tuple2Index);
il.Emit(OpCodes.Ldfld, field);

...
}
Проблема в том, что вместо этого компилятор выдает следующий IL:

Код: Выделить всё

ldfld int32 valuetype [System.Private.CoreLib]System.ValueTuple`3::Item1
Где тип поля — int32 вместо параметра типа !0. В результате при выполнении сборки генерируется следующее исключение:

Код: Выделить всё

Unhandled exception. System.MissingFieldException: Field not found: 'System.ValueTuple`3.Item1'.
at Program.Main(String[])
Я также пробовал использовать открытый универсальный тип с помощью Type.GetGenericTypeDefinition(), но это тоже не работает, поскольку аргументы типа, очевидно, не заполнены.< /p>
Как получить поле из сконструированного универсального типа, возвращаемый тип которого в IL остается аргументом типа, а не заполненным типом?
Как получить поле из сконструированного универсального типа, возвращаемый тип которого в IL остается аргументом типа, а не заполненным типом?

Подробнее здесь: https://stackoverflow.com/questions/792 ... a-closed-g
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»