c# – 如何使用泛型测试NaN(或为什么NaN.Equals(NaN)== true)?
发布时间:2020-12-16 00:05:03 所属栏目:百科 来源:网络整理
导读:我需要在数组中找到最小值和最大值(不考虑此数组中可能的NaN值). 这很容易只使用double,但这些FindMin和FindMax函数必须使用泛型类型. 我试图用这种方式测试通用NaN: bool isNaNT(T value) where T : IEquatableT{ return !value.Equals(value);} 但是等于
我需要在数组中找到最小值和最大值(不考虑此数组中可能的NaN值).
这很容易只使用double,但这些FindMin和FindMax函数必须使用泛型类型. 我试图用这种方式测试通用NaN: bool isNaN<T>(T value) where T : IEquatable<T> { return !value.Equals(value); } 但是等于双倍的回归真的.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 解决方法
是.它不管泛型如何: double x = double.NaN; Console.WriteLine(x.Equals(x)); // True Console.WriteLine(x == x); // False 请注意,如果第二行打印为False,则会使 无论你用它做什么,基本上这种事都很讨厌. 鉴于您正在尝试查找最大/最小值,您可能想尝试使用IComparable< T>而不是IEquatable< T> – 这可能会让你以其他方式检测NaN. (我现在没时间检查.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |