我需要找到分钟和最大值在阵列值(未考虑到了可能的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); //结果是真的。 –
为什么你会期望测试一个值等于自己是假的? –