This question already has answers here:
Why does Nullable<T> HasValue property not throw NullReferenceException on Nulls?

(5 个回答)


4年前关闭。




考虑以下代码:
int? myInt = null;
var hasValue = myInt.HasValue;

这是完全可以接受的,HasValue 将返回 false。但是我如何设法引用空对象上的属性?以下是行不通的:
public class MyClass
{
    public bool MyBool { get { return true; } };
}

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

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

有人能告诉我为什么代码片段 1 不会引发异常,但为什么我的代码片段 2 会?

最佳答案

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

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

当您将 null 文字与 Nullable<T> 一起使用时,您实际上只是在创建一个值,其中 value 字段的默认值为 T ,而 hasValue 为 false。使用 HasValue 属性不是遵循引用 - 它只是从结构中获取一个字段。

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

所以关键点是:
  • Nullable<T> 是一个结构体,而不是一个类
  • Nullable<T> 类型的变量的值只是一个有两个字段的值,而不是引用
  • null 文字仅表示“相关类型的空值”,并不总是表示空引用。
  • 关于c# - 我怎么可能在空对象上调用 HasValue?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27397471/

    10-10 12:29