C#对象不为null,但(myObject!= null)仍然返回false

Pat*_*ins 18 c# null compare

我需要在对象和NULL之间进行比较.当对象不是NULL时,我用一些数据填充它.

这是代码:

 if (region != null)
 {
  ....
 }
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是当某些时候循环和循环时,region对象是非null(我可以在调试模式下看到其中的数据).在调试时一步一步,它不会进入IF语句...当我使用以下表达式进行快速监视时:我看到(region == null)返回false,AND(区域!= null )也返回错误... 为什么以及如何?

更新

有人指出对象是==和!=重载:

    public static bool operator ==(Region r1, Region r2)
    {
        if (object.ReferenceEquals(r1, null))
        {
            return false;
        }
        if (object.ReferenceEquals(r2, null))
        {
            return false;
        }

        return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
    }


    public static bool operator !=(Region r1, Region r2)
    {
        if (object.ReferenceEquals(r1, null))
        {
            return false;
        }
        if (object.ReferenceEquals(r2, null))
        {
            return false;
        }
        return (r1.Cmr.CompareTo(r2.Cmr) != 0 || r1.Id != r2.Id);
    }
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 29

是否为区域对象的类重载了==和/或!=运算符?

现在您已经发布了重载代码:

重载应该如下所示(代码取自Jon SkeetPhilip Rieck的帖子):

public static bool operator ==(Region r1, Region r2)
{
    if (object.ReferenceEquals( r1, r2)) {
        // handles if both are null as well as object identity
        return true;
    }

    if ((object)r1 == null || (object)r2 == null)
    {
       return false;
    }        

    return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
}

public static bool operator !=(Region r1, Region r2)
{
    return !(r1 == r2);
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 16

那些操作员过载被打破了.

首先,如果通过调用==并反转结果来实现!=,它会使生活变得更加容易.

其次,在无效检查之前==应该有:

if (object.ReferenceEquals(r1, r2))
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*eck 7

两个重载都不正确

 public static bool operator ==(Region r1, Region r2)
    {
        if (object.ReferenceEquals(r1, null))
        {
            return false;
        }
        if (object.ReferenceEquals(r2, null))
        {
            return false;
        }

        return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
    }
Run Code Online (Sandbox Code Playgroud)

如果r1和r2为null,则第一个测试(object.ReferenceEquals(r1,null))将返回false,即使r2也为null.

尝试

//ifs expanded a bit for readability
 public static bool operator ==(Region r1, Region r2)
    {
        if( (object)r1 == null && (object)r2 == null)
        {
           return true;
        }
        if( (object)r1 == null || (object)r2 == null)
        {
           return false;
        }        
        //btw - a quick shortcut here is also object.ReferenceEquals(r1, r2)

        return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
    }
Run Code Online (Sandbox Code Playgroud)