## Why is this an issue?

In C#, without constraints on a generic type parameter, both reference and value types can be passed. However, comparing this type parameter to `null` can be misleading as value types, like `struct`, can never be null.

## How to fix it

To avoid unexpected comparisons:

- if you expect a value type, use default() for comparison
- if you expect a reference type, add a constraint to prevent value types from being passed

### Code examples

#### Noncompliant code example

    bool IsDefault<T>(T value)
    {
      if (value == null) // Noncompliant
      {
        // ...
      }
    }

#### Compliant solution

    bool IsDefault<T>(T value)
    {
      if (EqualityComparer<T>.Default.Equals(value, default(T)))
      {
        // ...
      }
    }

or

    bool IsDefault<T>(T value) where T : class
    {
      if (value == null)
      {
        // ...
      }
    }

## Resources

### Documentation

- Microsoft Learn - Constraints on type parameters
- Microsoft Learn - Reference types
- Microsoft Learn - Value types
- Microsoft Learn - `default` operator