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

标签 c# generics

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

public void MyMethod<T>(T myArgument)

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

if (myArgument == default(T))

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

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

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

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

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

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

最佳答案

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

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

这将匹配:

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

关于c# - C# 中泛型参数的空值或默认比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/864243/

相关文章:

c# - 使用数据模型在 dynamodb 中进行条件更新

.net - 将 LINQ to XML 结果转换为 VB.NET 中的通用列表。奇数错误

java - 如何在java中的通用数组中使用compareTo?

Java泛型问号和继承

C#/MySQL - 从数据库中获取日期

c# - 计算属性的 MVVM 更新

c# - 在 DataGridView 中显示过滤的行

c# - 如何在没有 ASP.NET Core 的情况下将 Json 数据从 Controller 发送到 javascript?

java - 使用泛型而不是可克隆的原型(prototype)模式

c# - 使用泛型作为异步方法的返回类型