NaN에 대한 메서드 동작 변경과 동일
다음 형식에 대한 Equals(T other)
인스턴스 메서드가 IEquatable<T> 구현 요구 사항을 충족하도록 업데이트되었습니다. 결과적으로 메서드는 이제 NaN을 올바르게 처리합니다. 이렇게 변경하면 GetHashCode
, Dictionary<TKey,TValue> 및 기타 해시 집합과 함께 형식을 올바르게 사용할 수 있습니다.
- System.Numerics.Matrix3x2
- System.Numerics.Matrix4x4
- System.Numerics.Plane
- System.Numerics.Quaternion
- System.Numerics.Vector2
- System.Numerics.Vector3
- System.Numerics.Vector4
- System.Numerics.Vector<T>
- System.Runtime.Intrinsics.Vector64<T>
- System.Runtime.Intrinsics.Vector128<T>
- System.Runtime.Intrinsics.Vector256<T>
이전 동작
이전에는 Equals(T other)
인스턴스 메서드가 IEEE 754 요구 사항을 따르고 ==
구현으로 지연되었습니다. 즉 NaN != NaN
, 두 NaN이 비트 단위로 동일한 경우에도 마찬가지입니다.
예시:
float f = float.NaN;
Console.WriteLine(f == f); // False
Console.WriteLine(f.Equals(f)); // True
나열된 몇 가지 형식에 대해 다음을 수행합니다.
Vector2 v = new Vector2(float.NaN);
Console.WriteLine(v == v); // False
Console.WriteLine(v.Equals(v)); // False
사전에서 이러한 형식 중 하나를 키로 사용하면 키를 확인할 수 없기 때문에 문제가 됩니다.
Vector2 v = new Vector2(float.NaN);
var s = new HashSet<Vector2>();
s.Add(v);
Console.WriteLine(s.Contains(v)); // False
새 동작
이제 동작은 기본 부동 소수점 형식과 동일합니다. 즉, ==
및 !=
메서드는 NaN != NaN
인 IEEE 754 요구 사항을 계속 따릅니다. 그러나 Equals(T other)
인스턴스 메서드는 IEquatable<T> 요구 사항을 따르므로 NaN.Equals(NaN)
입니다.
예를 들어(변경 없음):
float f = float.NaN;
Console.WriteLine(f == f); // False
Console.WriteLine(f.Equals(f)); // True
나열된 여러 형식의 경우(이제 두 번째 줄은 True
(을)를 인쇄):
Vector2 v = new Vector2(float.NaN);
Console.WriteLine(v == v); // False
Console.WriteLine(v.Equals(v)); // True
그리고 일부 해시 집합에 사용되는 경우(출력은 이제 True
(을)를 인쇄)
Vector2 v = new Vector2(float.NaN);
var s = new HashSet<Vector2>();
s.Add(v);
Console.WriteLine(s.Contains(v)); // True
도입된 버전
.NET 7
호환성이 손상되는 변경의 형식
이 변경은 이진 호환성에 영향을 줄 수 있습니다.
변경 이유
이전 구현은 IEquatable<T> 또는 object.Equals(object obj)
의 구현 요구 사항을 충족하지 못했습니다. 이로 인해 영향을 받는 형식을 해시 집합이나 GetHashCode
에 사용할 수 없게 되었습니다.
권장 작업
이전 동작을 선호하는 경우 Equals(T other)
대신 ==
또는 !=
(을)를 사용하도록 전환합니다.
영향을 받는 API
- System.Numerics.Matrix3x2.Equals
- System.Numerics.Matrix4x4.Equals
- System.Numerics.Plane.Equals
- System.Numerics.Quaternion.Equals
- System.Numerics.Vector2.Equals
- System.Numerics.Vector3.Equals
- System.Numerics.Vector4.Equals
- System.Numerics.Vector<T>.Equals
- System.Runtime.Intrinsics.Vector64<T>.Equals
- System.Runtime.Intrinsics.Vector128<T>.Equals
- System.Runtime.Intrinsics.Vector256<T>.Equals
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기