Minha abordagem é fazer
(object)item == null
no qual estou contando com object
o próprio operador de igualdade, que não pode dar errado. Ou um método de extensão personalizada (e uma sobrecarga):
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null;
}
public static bool IsNull<T>(this T? obj) where T : struct
{
return !obj.HasValue;
}
ou para lidar com mais casos, podem ser:
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null || obj == DBNull.Value;
}
A restrição impede IsNull
tipos de valor. Agora é tão doce quanto chamar
object obj = new object();
Guid? guid = null;
bool b = obj.IsNull(); // false
b = guid.IsNull(); // true
2.IsNull(); // error
o que significa que sempre tenho um estilo consistente / não sujeito a erros de verificação de nulos. Eu também descobri que (object)item == null
é muito, muito ligeiramente mais rápido do queObject.ReferenceEquals(item, null)
, mas apenas se for importante (atualmente estou trabalhando em algo onde devo micro-otimizar tudo!).
Para ver um guia completo sobre a implementação de verificações de igualdade, consulte O que é "prática recomendada" para comparar duas instâncias de um tipo de referência?
Assert.IsFalse(foo2 == foo1);