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

2 c# variables nullable exception

请考虑以下代码:

int? myInt = null;
var hasValue = myInt.HasValue;
Run Code Online (Sandbox Code Playgroud)

这是完全可以接受的,并且HasValue将返回false.但是我如何设法在一个null的对象上引用属性?以下不起作用:

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

// Elsewhere in code...
MyClass myObject = null;
myObject.MyBool;
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 8

在第一种情况下,您有一个类型的值Nullable<int>,即" 类型的空值".该Nullable<T>类型是值类型有两个领域,就像这样:

public struct Nullable<T> where T : struct
{
    private T value;
    private bool hasValue;
}
Run Code Online (Sandbox Code Playgroud)

当您使用null带有a 的文字时Nullable<T>,您实际上只是创建一个值,其中该value字段的默认值为T,并且hasValue为false.使用该HasValue属性不遵循引用 - 它只是从结构中获取一个字段.

在第二种情况下,值myObject是一个空引用 ...所以如果你尝试使用该MyBool属性,那就失败了,因为它试图在没有一个对象时找到它.

所以关键点是:

  • Nullable<T> 是一个结构,而不是一个类
  • 类型变量的Nullable<T>值只是具有两个字段的值,而不是引用
  • null文本只是意味着"相关类型的空值",但这并不总是意味着空引用.

  • @DeeMac:Reflector,语言规范和MSDN.听起来你可能会从我的书C#深度中受益 - 但没有压力:) (4认同)