我怎么可能在空对象上调用HasValue?

时间:2014-12-10 09:32:08

标签: c# variables exception nullable

请考虑以下代码:

int? myInt = null;
var hasValue = myInt.HasValue;

这是完全可以接受的,HasValue将返回false。但是我如何设法在一个null的对象上引用属性?以下方法无效:

public class MyClass
{
    public bool MyBool { get { return true; } };
}

// Elsewhere in code...
MyClass myObject = null;
myObject.MyBool;

这会引发空引用异常。事实上,我正在比较上面的两个代码片段,好像它们是相同的,这告诉我,我在某处误解了结构或某种语法。

有人可以告诉我为什么代码段1不会引发异常,但为什么我的代码片段会出现?

1 个答案:

答案 0 :(得分:8)

在第一种情况下,您具有类型Nullable<int>的值,即“类型的空值”。 Nullable<T>类型是一个包含两个字段的值类型,如下所示:

public struct Nullable<T> where T : struct
{
    private T value;
    private bool hasValue;
}

当您将null字面值与Nullable<T>一起使用时,您实际上只是创建了value字段的默认值为T的值,并且{ {1}}是假的。使用hasValue属性不遵循引用 - 它只是从结构中获取一个字段。

在第二种情况下,HasValue的值为null 引用 ...因此,如果您尝试使用myObject属性,则会失败,因为它正在尝试找不到没有的物体。

所以关键点是:

  • MyBool是一个结构,而不是一个类
  • Nullable<T>类型变量的值只是一个包含两个字段的值,不是参考
  • Nullable<T>字面值仅表示“相关类型的空值”,它总是表示空引用。