小编典典

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

all

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

public void MyMethod<T>(T myArgument)

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

if (myArgument == default(T))

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

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

现在可以编译,但如果 myArgument 为空,则将失败,这是我正在测试的一部分。我可以像这样添加一个明确的空检查:

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

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

我需要同时支持 引用 类型和值类型。


阅读 104

收藏
2022-04-14

共1个答案

小编典典

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

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

这将匹配:

  • 类为空
  • 空(空)为Nullable<T>
  • 其他结构的零/假/等
2022-04-14