CA2242: Testar para NaN corretamente

Property Valor
ID da regra CA2242
Título Testar para NaN corretamente
Categoria Usage
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Uma expressão testa um valor em relação a System.Single.NaN ou System.Double.NaN.

Descrição da regra

System.Double.NaN, que representa um valor que não é um número, resulta quando uma operação aritmética não é definida. Qualquer expressão que testa a igualdade entre um valor e System.Double.NaN sempre retorna false. Qualquer expressão que teste a desigualdade (!= em C#) entre um valor e System.Double.NaN, sempre retorna true.

Como corrigir violações

Para corrigir uma violação dessa regra e determinar com precisão se um valor representa System.Double.NaN, use System.Single.IsNaN ou System.Double.IsNaN teste o valor.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo

O exemplo a seguir mostra duas expressões que testam incorretamente um valor em relação a System.Double.NaN e uma expressão que usa System.Double.IsNaN corretamente para testar o valor.

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));
    }
}