请考虑以下代码:
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不会引发异常,但为什么我的代码片段会出现?
答案 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>
字面值仅表示“相关类型的空值”,它不总是表示空引用。