Приведение аргументов вызова в соответствии с 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
Нет.