我需要找到分鐘和最大值在陣列值(未考慮到了可能的NaN值這個陣列中)。如何使用泛型測試NaN(或爲什麼NaN.Equals(NaN)== true)?
這將很容易只使用double
,但這些FindMin和FindMax函數必須與泛型類型一起使用。
我試圖以這種方式來測試通用的NaN:
bool isNaN<T>(T value) where T : IEquatable<T>
{
return !value.Equals(value);
}
但Equals
正在恢復true
爲double.NaN
?? !!
我有這樣的一種解決方法現在:
bool isNaN<T>(T value) where T : IEquatable<T>
{
var d = value as double?;
if (d.HasValue) { return double.IsNaN(d.Value); }
return !value.Equals(value);
}
我的問題更多的是理解爲什麼第一個解決方案沒有工作,這是一個錯誤?
你可以找到小測試代碼here
該代碼是否應該讀取'value.Equals(value)'?或者更像'value.Equals(...其他值...)'? –
var result = double.NaN.Equals(double.NaN); //結果是真的。 –
爲什麼你會期望測試一個值等於自己是假的? –