通过


CA2242: 正确地检测 NaN

属性
规则 ID CA2242
标题 正确测试 NaN
类别 使用情况
修复会引起中断还是不会引起中断 非中断
在 .NET 10 中默认启用 作为一种建议
适用的语言 C# 和 Visual Basic

原因

一个表达式将一个值与 System.Single.NaNSystem.Double.NaN 进行测试。

规则说明

System.Double.NaN,它表示非数值的值,算术运算未定义时会得到这样的值。 测试一个值和 System.Double.NaN 是否相等的任何表达式都始终返回 false。 测试一个值和 != 是否不相等(C# 中的 System.Double.NaN)的任何表达式都始终返回 true

如何解决违规

若要解决与此规则的冲突,并准确确定某个值是否表示 System.Double.NaN,请使用 System.Single.IsNaNSystem.Double.IsNaN 来测试该值。

何时禁止显示警告

不要抑制此规则发出的警告。

示例

下面的示例显示了错误地针对 System.Double.NaN 测试值的两个表达式,以及正确使用 System.Double.IsNaN 来测试值的一个表达式。

Imports System

Namespace ca2242

    Class NaNTests

        Shared zero As Double

        Shared Sub Main2242()
            Console.WriteLine(0 / zero = Double.NaN)
            Console.WriteLine(0 / zero <> Double.NaN)
            Console.WriteLine(Double.IsNaN(0 / zero))
        End Sub

    End Class

End Namespace
class NaNTests
{
    static double zero = 0;

    static void RunIt()
    {
        Console.WriteLine(0 / zero == double.NaN);
        Console.WriteLine(0 / zero != double.NaN);
        Console.WriteLine(double.IsNaN(0 / zero));
    }
}