所以我希望社区能够为我们澄清这个问题。 ;P
它是0。
从ECMA-335规范中的ldnull片段:
可能认为ldnull是多余的:为什么不使用ldc.i4.0或ldc.i8.0呢?答案是,ldnull提供了一个大小不确定的null - 类似于不存在的ldc.i指令。但是,即使CIL包括ldc.i指令,保留ldnull指令对于验证算法仍然有益,因为它使类型跟踪更加容易。
当可空类型实例被设置为null时,其底层值为零。
更具体地说,可空类型是一种结构,它将基础类型的值与布尔值的null指示器组合在一起。可空类型的实例有两个公共只读属性:HasValue,类型为bool,和可空类型的基础类型的Value。
对于非空实例,HasValue为true,对于null实例,HasValue为false。
因此,当HasValue为true时,Value属性返回包含的值。当HasValue为false时,尝试访问Value属性会引发异常。但如果你能够访问它,你会发现它包含了零。
Nullable<T>
- 而不是空引用。 - Jon Skeet从我的经验来看,我相信 Nothing
不会起作用,DBNull.Value
也是如此。
来自MSDN:
null关键字是一个字面量,表示一个空引用,即不引用任何对象
为了在旧版本的C#中更清晰地表达,值类型不能为null,即必须有一个值,如果您没有分配一个值,那么您将得到一个潜在的随机值,因此类似于:
int i;
i++;
console.writeline(i);
int? i;
i++;
console.writeline(i);
由于i从未被初始化为除null以外的任何值,因此实际上会在i++处引发异常。如果null是0,则此代码将执行良好,因为它只会计算为0 + 1,但这是不正确的行为。
如果null始终为0,并且您有一个可空整数,并编写了以下代码:
int? i;
if (int == 0)
{
//do something
}
如果 null 和 0 相同,那么你可能会遇到一些意想不到的行为,因为编译器无法区分 int 是 null 还是显式设置为 0。
另一个例子可以更好地阐明这个问题:
public int? AddNumbers(int? x, int? y)
{
if (x == null || y == null)
return null;
if (x == 0)
return y;
if (y == 0)
return x;
return x + y;
}