다음을 통해 공유


ECMA-335에 따라 호출 인수 강제 변환

ECMA-335(표 III.9: 서명 일치)는 호출 인수에 지원되는 암시적 변환을 설명합니다. 이 변경은 지원되는 변환에 대한 검사를 추가합니다.

도입된 버전

6.0

변경 내용 설명

이전 .NET 버전에서 JIT(Just-In-Time) 컴파일러는 ECMA-335에 따라 호출 인수를 강제 변환하지 않습니다. 이로 인해 일부 플랫폼에서 정의되지 않은 동작이 발생합니다. 예를 들어 x86에서 int 레지스터로 long 값을 전달하면 레지스터가 정의되지 않은 상태로 남습니다.

.NET 6부터 암시적 변환이 허용되지 않으면 JIT 컴파일러가 InvalidProgramException을 throw합니다. 여전히 허용되는 두 가지 변환 사례가 있습니다.

  • 64비트 플랫폼의 int8 ->nint(자주 사용되며 잘못된 코드로 이어지지 않기 때문)
  • byref ->nint

변경 이유

이전 동작으로 인해 Arm64 Apple을 비롯한 일부 플랫폼에서 자동으로 잘못된 코드가 생성되었습니다.

.NET 6으로 업데이트하고 이 변경으로 인해 앱에서 InvalidProgramException 예외가 throw되는 경우 영향을 받는 인수에 대해 명시적 변환을 사용하거나 호출 수신자 선언을 수정합니다.

영향을 받는 API

없음