Что такое __PostIncrement в декомпилированном VB (от ILSpy)

Я просто просматривал декомпилированный код для System.Collections.Generic.List(Of T).Add(item As T) с помощью ILSpy и нашел вызов __PostIncrement. Я никогда не слышал о такой вещи в VB, поэтому я немного покопался и нашел:

  1. В VB код Me._items(__PostIncrement(Me._size)) = item.
  2. В C# код this._items[this._size++] = item; использует фактический оператор постинкремента на этом языке.
  3. В MSIL нет вызова функции. Похоже, он работает так же, как пост-инкремент C # (комментарии мои, но я не эксперт в MSIL, поэтому могу ошибаться).

Код:

IL_001e: ldarg.0
IL_001f: ldfld !0[] class System.Collections.Generic.List`1<!T>::_items
IL_0024: ldarg.0
IL_0025: dup
IL_0026: ldfld int32 class System.Collections.Generic.List`1<!T>::_size
IL_002b: dup
IL_002c: stloc.0           // store the size pre incrementing
IL_002d: ldc.i4.1
IL_002e: add               // do the increment
IL_002f: stfld int32 class System.Collections.Generic.List`1<!T>::_size
IL_0034: ldloc.0           // reload the stored size to use as index in stelem
IL_0035: ldarg.1
IL_0036: stelem.any !T

Что это за __PostIncrement? Является ли изобретение SharpDevelop символом постинкрементного IL-кода в VB? Или это какое-то определение, которое я мог бы использовать в своем собственном коде VB?


person just.another.programmer    schedule 01.01.2013    source источник


Ответы (1)


__PostIncrement является эквивалентом C# operator++. Это быстрый способ увеличить (добавить единицу) число. К сожалению, согласно списку операторов в Visual Basic эквивалента нет.

person akton    schedule 01.01.2013
comment
Он определен где-то в спецификации языка VB, чтобы я мог использовать его и в своем коде? - person just.another.programmer; 01.01.2013
comment
Обновлен ответ, чтобы сказать, что VB не поддерживает ни префиксные, ни постфиксные версии операторов ++ или --. - person akton; 01.01.2013
comment
Я знаю это. Это мой вопрос. Почему ILSpy декомпилируется в __PostIncrement, если такого не существует? - person just.another.programmer; 01.01.2013
comment
Потому что он существует в IL. Библиотека, вероятно, была написана на C#, который поддерживает оператор, а затем вызывается из VB в вашем коде (и проверяется ILSpy). Что касается того, почему, см. вопросы/6339442/. - person akton; 01.01.2013
comment
@just.another.programmer Альтернативой является серьезная ошибка для любой функции, которую нельзя точно декомпилировать в VB.NET. Нет кода VB.NET, который приводит к IL в вашем вопросе. - person ; 01.01.2013
comment
Что вы имеете в виду, что он существует в IL? Вы имеете в виду конкретно dup OpCode, который С# использует для создания несохраненной копии переменной приращения? Я мог бы воспроизвести эффект этого в VB (путем создания моей собственной локальной переменной или вызова метода), но я не знаю, смогу ли я воспроизвести фактическое dup... - person just.another.programmer; 01.01.2013