NaN에 대한 메서드 동작 변경과 동일

다음 형식에 대한 Equals(T other) 인스턴스 메서드가 IEquatable<T> 구현 요구 사항을 충족하도록 업데이트되었습니다. 결과적으로 메서드는 이제 NaN을 올바르게 처리합니다. 이렇게 변경하면 GetHashCode, Dictionary<TKey,TValue> 및 기타 해시 집합과 함께 형식을 올바르게 사용할 수 있습니다.

이전 동작

이전에는 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