Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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#)问题_C#_Null_Operator Overloading - Fatal编程技术网

重载==运算符时的(C#)问题

重载==运算符时的(C#)问题,c#,null,operator-overloading,C#,Null,Operator Overloading,我在类上重载了==运算符,如下所示: public static bool operator ==(Table pt1, Table pt2) { return Compare(pt1, pt2) == 0 && pt1.TableName == pt2.TableName; } 比较将工作,就像SccMP在C++中一样,返回一个整数。问题是,如果我执行if(MY_CLASS==null),它将调用MY==运算符,从而调用我的比较函数。另一种选择是什么?检查pt1和pt

我在类上重载了==运算符,如下所示:

public static bool operator ==(Table pt1, Table pt2) {
    return Compare(pt1, pt2) == 0 && pt1.TableName == pt2.TableName;
}

比较将工作,就像SccMP在C++中一样,返回一个整数。问题是,如果我执行if(MY_CLASS==null),它将调用MY==运算符,从而调用我的比较函数。另一种选择是什么?检查pt1和pt2是否为空?或仅在pt2中?

只需将此行添加到您的操作员:

if ((object)pt1 == null || (object)pt2 == null) return false;
(object)
强制转换用于防止递归(调用
对象==
而不是
我的类==


虽然我不确定比较null和null时应该出现的条件。

您将需要null检查来获得正确的行为。我认为添加此检查的最清晰的方法是调用
object.ReferenceEquals(x,null)
,因为它是一个直接的非多态方法调用,并且可能相当有效。

您应该检查Microsoft是否实现了“==”运算符以及是否覆盖了“Equals()”

根据他们的例子,您可能需要如下内容:

public static bool operator ==(Table a, Table b)
{
    // If both are null, or both are same instance, return true.
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    // If one is null, but not both, return false.
    if (((object)a == null) || ((object)b == null))
    {
        return false;
    }

    // Return true if the fields match:
    return Compare(a, b) == 0 && a.TableName == b.TableName;
}

我问了一个类似的问题。看一看

    public bool Equals(ClauseBE other)
    {
        if (this._id == other._id)
        {
            return true;
        }
        return false;
    }

    public override bool Equals(Object obj)
    {
        if (obj == null)
        {
            return base.Equals(obj);
        }

        if (!(obj is ClauseBE))
        {
            throw new InvalidCastException("The 'obj' argument is not a ClauseBE object.");
        }

        return Equals(obj as ClauseBE);
    }

    public override int GetHashCode()
    {
        return this._id.GetHashCode();
    }


    public static bool operator ==(ClauseBE a, ClauseBE b)
    {
        if (ReferenceEquals(a, null) && ReferenceEquals(b, null))
        {
            return true;
        }

        if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
        {
            return false;
        }

        return a.Equals(b);
    }

    public static bool operator !=(ClauseBE a, ClauseBE b)
    {
        return !(a == b);
    }

我的意思是,我甚至不能检查它们是否为null,因为这将创建对我的==运算符的递归调用!我应该怎么做?这行吗?我认为这里的强制转换不会有任何区别,因为重写方法是虚拟的。你不重写==,你会重载它。我要么在两个位置都使用object.ReferenceEquals,要么在两个位置都使用强制转换,如果你明白我的意思。