Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Equals(null)在对象数组null检查中失败_C#_Object_Null_Comparison - Fatal编程技术网

C# 为什么Equals(null)在对象数组null检查中失败

C# 为什么Equals(null)在对象数组null检查中失败,c#,object,null,comparison,C#,Object,Null,Comparison,我有一个对象数组,如下所示: private object[] _yazdirmaBilgisi = new object[5]; 在某些情况下,我想访问第一个元素,但当然我想先检查它是否为null 在某些点上[0]为空,但[1]不为空 当我使用Equals检查值是否为null时,它会引发异常: if (!_yazdirmaBilgisi[0].Equals(null)) //Throws exception 但是如果我检查=空ne异常 if (_yazdirmaBilgisi[0] !=

我有一个对象数组,如下所示:

private object[] _yazdirmaBilgisi = new object[5];
在某些情况下,我想访问第一个元素,但当然我想先检查它是否为null

在某些点上[0]为空,但[1]不为空

当我使用
Equals
检查值是否为null时,它会引发异常:

if (!_yazdirmaBilgisi[0].Equals(null))  //Throws exception
但是如果我检查
=空ne异常

if (_yazdirmaBilgisi[0] != null) // No exception
为什么不同?
为什么
等于(null)
抛出异常,但
!=null
不会

第一个抛出,因为列表中的第一个元素是null引用。这就是您的代码所做的:

var element = _yazdirmaBilgisi[0];
if (element.Equals(null)) // element is null, and null.Equals is calling a method on a null reference
==运算符的定义与此类似:

var element = _yazdirmaBilgisi[0]; // element is reference who's value is null
if (object.ReferenceEquals(element, null)) // object.Equals is a static method which doesn't require an object instance
这一行:

if (!_yazdirmaBilgisi[0].Equals(null)) 
  • \u yazdirmaBilgisi[0]
  • 将该引用用作调用
    .Equals()
    的对象
  • 但由于该引用是
    null
    ,因此它会抛出
    NullReferenceException

    鉴于:

    if (_yazdirmaBilgisi[0] != null)
    

    直接将
    \u yazdirmaBilgisi[0]
    中的引用与null进行比较,因此不会引发异常-它不会尝试调用被引用对象的任何方法。

    因为
    ==null
    .Equals(null)
    不同。如果使用
    Equals
    ,显然会因为尝试访问空引用而出现异常
    =
    的工作原理不同,类似于
    对象。Equals(a,b)
    首先检查两个值是否为null,然后进行更多比较。

    \u yazdirmaBilgisi[0]。Equals
    表示您正在尝试调用实例方法
    Equals
    ,因为
    \u yazdirmaBilgisi[0]
    为null,您将得到NRE@Habib即使很短,您可以将其作为答案发布^^^,它会引发什么异常?所以你可以回答你自己的问题。请说清楚,我们必须猜测你的代码有什么问题才能回答。@PatrickHofman我想他不是说他的代码有什么问题,他只是问为什么两种不同的检查产生不同的结果。看起来更像是一个新手问题。==运算符被重载了,这样做是有误导性的。@SriramSakthivel我删除了重载这个词,但在其他方面它是如何误导的?现在没问题了。不仅重载这个词有误导性,而且你说做
    object.Equals是重载的,这是错误的。后来您将其更改为
    ReferenceEquals
    @SriramSakthivel我也不确定我是否喜欢ReferenceEquals(这就是为什么我说我的代码类似)。在这个问题中,他显式地使用System.Objects,但字符串确实定义了==运算符,这比我的示例要复杂一些。