如果null.Equals(null)为什么我会得到NullReferenceException

时间:2010-08-11 15:01:36

标签: c# null nullreferenceexception

我有以下代码行:

var selectedDomainID = lkuDomainType.EditValue.Equals(null) 
    ? string.Empty 
    : lkuDomainType.EditValue;

有时会生成NullReferenceException。我不明白的是为什么。我的代码不是检查null的全部内容,如果是,请指定string.empty?当我签入DEBUG时,它说EditValue == null所以我错过了什么?

10 个答案:

答案 0 :(得分:28)

使用lkuDomainType.EditValue == null,否则您尝试在空对象上调用实例方法。但更好的选择可能是lkuDomainType.EditValue ?? String.Empty。另请注意lkuDomainType为空,除非它是一个类而不是对象。

答案 1 :(得分:15)

当您使用Object.Property并且Object未定义时,您将取消引用空指针,这就是您获得异常的原因。相反,使用:

var selectedDomainID = lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue;

答案 2 :(得分:5)

如果EditValue为空,则无法调用Equals。在这种情况下,你必须这样做:

var selectedDomainID = lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue;

或者您可以通过以下方式简化它:

var selectedDomainID = lkuDomainType.EditValue ?? string.Empty;

答案 3 :(得分:3)

你试图在空对象上调用Equals方法 - 改为这样做:

lkuDomainType.EditValue == null

答案 4 :(得分:3)

问题是您在检查对象是否为null之前使用该对象。您正在调用对象的Equals方法,如果引用为null,则该方法将失败。

您必须与lkuDomainType.EditValue.Equals(null)交换lkuDomainType.EditValue == null

答案 5 :(得分:2)

EditValue == null。这意味着那里没有任何对象。即使函数是.Equals()。

,也无法调用null对象上的函数

在这种情况下,你最好只说“(lkuDomainType.EditValue == null)”。

答案 6 :(得分:2)

您应该在这里使用String.IsNullOrEmpty。像这样:

var selectedDomainID = String.IsNullOrEmpty(lkuDomainType.EditValue) ? string.Empty : lkuDomainType.EditValue;

Equals是一种方法,你试图在抛出异常的null对象上调用一个方法。

答案 7 :(得分:2)

当EditValue为null时,您无法在其上调用Equals方法,因此检查的最佳方法是使用

lkuDomainType.EditValue == null ? string.Empty : lkuDomainType.EditValue;

答案 8 :(得分:0)

如果lkuDomainType.EditValue为null,则“lkuDomainType.EditValue.Equals(someObject)”与编码“null.Equals(someObject)”相同。好吧,显然“null”没有任何成员或方法(如果确实如此,它将不会为null)。这就是你得到NullReferenceException的原因。

其他帖子中的大多数示例都可以使用,包括String.IsNullOrEmpty,这是一个返回布尔值的方法。

答案 9 :(得分:0)

所有当前的答案都未能解决一个关键点:在 Equals 类型(即 Nullable)与 struct 类型上调用 class 之间的区别。< /p>

在值为 null 的 Equals 类型对象上调用 Nullable 不会发出异常,而对 class 类型对象执行相同操作会。

考虑以下代码:

int? num = null; // int? is Nullable<int>
String s = null; // String is a class

var equalsNullable = num.Equals(null); // works
var equalsClass = s.Equals(null);      // throws

原因是在这种情况下调用了 NullableHasValue 方法,有关详细信息,请参阅 Jon Skeet's answer

正如其他人所说,在 OP 的情况下,要使用的方法是使用 ==??