This question already has answers here:
Why does Nullable<T> HasValue property not throw NullReferenceException on Nulls?
(5 个回答)
4年前关闭。
考虑以下代码:
这是完全可以接受的,
这将引发空引用异常。我正在比较上面的两个代码片段,好像它们是相等的,这一事实告诉我,我在某处误解了结构或某些语法。
有人能告诉我为什么代码片段 1 不会引发异常,但为什么我的代码片段 2 会?
当您将
在第二种情况下,
所以关键点是:
(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