Приведение аргументов вызова в соответствии с ECMA-335

ECMA-335 (таблица III.9: соответствие сигнатуры) описывает, какие неявные преобразования поддерживаются для аргументов вызова. В результате этого изменения добавляется проверка поддерживаемых преобразований.

Представленные версии

6,0

Описание изменения

В предыдущих версиях .NET компилятор JIT не приводит аргументы вызова в соответствии с ECMA-335. Это приводит к неопределенному поведению на некоторых платформах. Например, на платформе x86 передача значения long в качестве регистра int оставляет регистр неопределенным.

Начиная с .NET 6, если неявное преобразование запрещено, JIT-компилятор выдает InvalidProgramException. Существует два варианта преобразования, которые все еще разрешены:

  • int8 —>nint на 64-разрядной платформе (так как она часто используется и не приводит к плохому коду)
  • byref ->nint

Причина изменения

Предыдущее поведение вызвало автоматическое, плохое создание кода на некоторых платформах, включая Arm64 Apple.

Если вы обновили версию до .NET 6 и приложение выдает исключения InvalidProgramException из-за этого изменения, используйте явное преобразование для затронутого аргумента или исправьте объявление вызываемого объекта.

Затронутые API

Нет.