EqualsNull

EqualsNull

Summary

Use is null instead of == null.

Default severity

Info

Description

This rule reports diagnostic information of using == or != operators with null as follows:

  • The operator is either == or !=.
  • The right operand must be null.
  • The type of the left operand must not be a non-nullable value type. (If it is a non-nullable value type, the compiler raises CS0472 and the expression is always true or false.)

Note that the default diagnostic severity of this analyzer is Information.

Code fix

The code fix provides an option replacing expression ... == null and ... != null with ... is null and !(... is null), respectively.

Remarks

It can be a breaking change to replace the expression ... == null with ... is null, as well as ... != null with !(... is null), and vice versa. For example, the expressions o is null and o == null result in the same IL code as long as its equality operators are not overridden, as follows.

class C
{
    bool IsNull(C o) => o is null;
    /*
        IL_0000: ldarg.1
        IL_0001: ldnull
        IL_0002: ceq
        IL_0004: ret
    */

    bool EqualsNull(C o) => o == null;
    /*
        IL_0000: ldarg.1
        IL_0001: ldnull
        IL_0002: ceq
        IL_0004: ret
    */
}

However, when its equality operators are overridden, those expressions result in different IL codes, as follows.

class C
{
    bool IsNull(C o) => o is null;
    /*
        IL_0000: ldarg.1
        IL_0001: ldnull
        IL_0002: ceq
        IL_0004: ret
    */

    bool EqualsNull(C o) => o == null;
    /*
        IL_0000: ldarg.1
        IL_0001: ldnull
        IL_0002: call bool C::op_Equality(class C, class C)
        IL_0007: ret
    */

    public static bool operator== (C o1, C o2)
        => object.ReferenceEquals(o1, o2);

    public static bool operator!= (C o1, C o2)
        => !object.ReferenceEquals(o1, o2);
}

Note that the result of o == null may differ from the one of o is null if the equality operators are strangely overridden as follows.

class C
{
    ...
    public static bool operator== (C o1, C o2) => true;
    public static bool operator!= (C o1, C o2) => false;
}

Example

Diagnostic

public void Method(object o, string s)
{
    if (o == null)
    {
        ⋮
    }
    if (s != null)
    {
        ⋮
    }
    ⋮

Code fix

public void Method(object o, string s)
{
    if (o is null)
    {
        ⋮
    }
    if (!(s is null))
    {
        ⋮
    }
    ⋮