Partilhar via


CA2242: Teste para NaN corretamente

Property valor
ID da regra CA2242
Título Teste NaN corretamente
Categoria Utilização
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Como sugestão

Motivo

Uma expressão testa um valor contra 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 é indefinida. 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 desta regra e determinar com precisão se um valor representa System.Double.NaN, use System.Single.IsNaN ou System.Double.IsNaN para testar o valor.

Quando suprimir avisos

Não suprima um aviso desta regra.

Exemplo

O exemplo a seguir mostra duas expressões que testam incorretamente um valor e System.Double.NaN 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));
    }
}