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 -
defaultoperator