一尘不染

C#中泛型参数的空值或默认比较

c#

我有这样定义的通用方法:

public void MyMethod<T>(T myArgument)

我要做的第一件事是检查myArgument的值是否是该类型的默认值,如下所示:

if (myArgument == default(T))

但这不能编译,因为我不能保证T将实现==运算符。所以我将代码切换为:

if (myArgument.Equals(default(T)))

现在可以编译,但是如果myArgument为null,则失败,这是我要测试的一部分。我可以像这样添加一个显式的null检查:

if (myArgument == null || myArgument.Equals(default(T)))

现在,这对我来说是多余的。ReSharper甚至建议我将myArgument == null部分更改为myArgument ==
default(T),这是我开始的地方。有解决这个问题的更好方法吗?

我需要支持 两种 引用类型和值类型。


阅读 518

收藏
2020-05-19

共1个答案

一尘不染

为避免装箱,比较泛型是否相等的最佳方法是EqualityComparer<T>.Default。这方面IEquatable<T>(没有拳击)以及object.Equals,都应处理所有Nullable<T>“解除”的细微差别。因此:

if(EqualityComparer<T>.Default.Equals(obj, default(T))) {
    return obj;
}

这将匹配:

  • 类的null
  • 空的(空) Nullable<T>
  • 零/假/等其他结构
2020-05-19