在C#4中使用Nullable <T>时会遇到麻烦

Tom*_*han 10 c# nullable

我刚刚开始编写一个组件,我发现将一些属性声明为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.