我一直在具有可空引用类型的项目中自由使用is
运算符:
// Works just fine
public CheckClass Foo(CheckClass? arg)
{
return arg is CheckClass
? arg
: new();
}
但是,这会引发编译时错误:
// Cannot convert 'int?' to 'int'
public int Bar(int? arg)
{
return arg is int
? arg
: 0;
}
通过使用arg
上的.Value
属性,很容易修复.据我所知,可空引用类型是一种"软"编译时验证,而Nullable<T>
是一种"硬"泛型类.
尽管如此,这还是有点令人恼火,而且似乎很奇怪,因为Nullable<T>
在很多情况下都得到了优惠待遇.首先,is
表达式完全能够判断值的存在,并且如果给它一个名称,它可以生成一个等价类型的不可空对象.
// Noooo problem
public int Bar(int? arg)
{
return arg is int val
? val
: 0;
}
这种行为是明确 Select 的,还是疏忽的?如果是前者,背后的理由可能是什么?