引用类型(类)的变量可以为空,而值类型(结构)的变量不能。
    空类型是可以为空的值类型。

    可空类型只需要在类型的后面添加“?”(它必须是结构)。

    1. //x1是一个普通的int, x2是一个可以为空的int。
    2. //因为x2是可以为空的int,所以可以把null分配给x2:
    3. int x1 = 1;
    4. int? x2 = null;

    因为int值可以分配给int?,所以给int?传递一个int变量总是会成功,编译器会接受它:

    1. int? x3 = x1;
    2. //可空类型可以接受普通类型的传值,但普通类型接受可控类型要进行强制转化。
    3. int x4 = (int)x3;
    4. //如果x3是null,类型转换操作就会生成一个异常。

    更好的方法是使用可空类型的HasValue和Value属性。
    HasValue返回true或false,这取决于可空类型是否有值,Value返回底层的值。

    1. int x5 = x3.HasValue ? x3.Value: -1;

    合并操作符

    1. //如果x3是null,则用变量x6给它设置-1,否则提取x3的值:
    2. int x6 = x3 ??-1;