提问人:codymanix 提问时间:7/18/2023 更新时间:7/18/2023 访问量:56
区分泛型方法中的 null 和默认值
Differentiate between null and default in generic method
问:
我有一个支持所有类型的方法,我想检查值是否为 null,但仅适用于引用类型,对于值类型,这种检查没有意义。 由于此方法位于调用树的深处,因此仅复制引用类型的方法并在那里使用类约束会很复杂。
void Foo<T>(T a)
{
// check for null for reference types only
if (a == null)
{
}
}
答:
4赞
Tim Schmelter
7/18/2023
#1
如果要“仅检查引用类型的 null”,则可以使用 Type.IsValueType
:
void Foo<T>(T a)
{
bool isReferenceType = !typeof(T).IsValueType;
if (isReferenceType && a == null)
{
}
}
因此,可为空的类型(它们是结构,因此是值类型)即使返回也不会通过此检查。我想这是预期的行为。a == null
true
4赞
canton7
7/18/2023
#2
如果是值类型(并且不是可为 null 的值类型,例如 ),则测试仍然完全有效:测试永远不可能,并且整个语句将被运行时优化。T
int?
a == null
a == null
true
if
如果是可为 null 的值类型,则当 的值为 (例如 )。T
a == null
a
null
Foo<int?>(null)
if can 是一个可以为 null 的值类型,并且您不想输入 if is ,那么 Tim Schmelter 的答案会做你想要的,但会有点低效(尽管下一个 .NET 版本将显着改进这一点)。T
if
a
null
评论
Type.IsValueType
int?