我刚刚开始编写一个组件,我发现将一些属性声明为nullable可能是有用的,而不是让它们求助于默认值.但是,我意识到我以前从未使用过non-nullable-type?语法或Nullable<T>类型,所以可能会有一些问题很快就会突然出现并咬我.所以...
使用时的最大陷阱Nullable<T>和简写?语法是什么?
我该如何解决这些问题?
当我开始使用它们时,我可以获得哪些最大的优势/新的可能性?
Mar*_*ers 18
一个常见的问题是尝试使用条件表达式分配给可空变量,如下所示:
bool useDefault = true;
int defaultValue = 50;
int? y = useDefault ? defaultValue : null;
Run Code Online (Sandbox Code Playgroud)
乍一看,这可能看起来应该可以工作,但实际上它会产生编译错误:
Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and '<null>'
解决方案:为一个或两个可能的结果添加一个强制转换:
int? y = useDefault ? defaultValue : (int?)null;
Run Code Online (Sandbox Code Playgroud)
不太常见的:一般而言,这是安全的假设,对于整数a <= 5和!(a > 5)是等价的.对于可空整数,这种假设不正确.
int? x = null;
Console.WriteLine(x <= 5);
Console.WriteLine(!(x > 5));
Run Code Online (Sandbox Code Playgroud)
结果:
False True
解决方案:分别处理空案例.
这是上面的另一个细微变化:
int? y = null;
int? z = null;
Console.WriteLine(y == z);
Console.WriteLine(y <= z);
Run Code Online (Sandbox Code Playgroud)
输出:
True False
所以y是等于到z,但它不小于或等于到z.
解决方案:同样,单独处理null情况可以避免意外.
Eri*_*ert 10
人们经常感到惊讶的是,没有像盒装可以为空的值类型这样的东西.如果你说:
int? x = 123;
int? y = null;
int z = 456;
object xx = x;
object yy = y;
object zz = z;
Run Code Online (Sandbox Code Playgroud)
你可能会认为,因为zz包含一个盒装的int,所以xx和yy包含盒装的可空int.他们不.xx包含一个盒装的int.yy设置为null.