作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个这样定义的通用方法:
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/
我是一名优秀的程序员,十分优秀!