【发布时间】:2008-09-15 18:17:59
【问题描述】:
我有一个这样定义的通用方法:
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) 部分。有没有更好的方法来解决这个问题?
我需要同时支持引用类型和值类型。
【问题讨论】:
-
C# 现在支持Null Conditional Operators,这是您给出的最后一个示例的语法糖。您的代码将变为
if (myArgument?.Equals( default(T) ) != null )。 -
@wizard07KSU 这对值类型不起作用,即在任何情况下都计算为
true,因为Equals将始终被调用为值类型,因为myArgument在此不能是null大小写和Equals(布尔值)的结果永远不会是null。 -
同样有价值的几乎重复(所以不投票结束):Can't operator == be applied to generic types in C#?