当对象被装箱时,如何进行==运算符重载

5
以下代码的输出如下: 不相等
相等
请注意x和xx的类型差异,==操作符重载仅在第二种情况下执行,而在第一种情况下不执行。
有没有办法重载==操作符,以便在比较MyDataObejct实例时始终执行它?
编辑1:#我想在MyDataClass上覆盖==运算符,我不确定如何做到让case1也执行重载的==实现。
class Program {
    static void Main(string[] args) {
        // CASE 1
        Object x = new MyDataClass();
        Object y = new MyDataClass();
        if ( x == y ) {
            Console.WriteLine("equal");
        } else {
            Console.WriteLine("not equal");
        }

        // CASE 2 
        MyDataClass xx = new MyDataClass();
        MyDataClass yy = new MyDataClass();
        if (xx == yy) {
            Console.WriteLine("equal");
        } else {
            Console.WriteLine("not equal");
        }
    }
}

public class MyDataClass {
    private int x = 5;

    public static bool operator ==(MyDataClass a, MyDataClass b) {
        return a.x == b.x;
    }

    public static bool operator !=(MyDataClass a, MyDataClass b) {
        return !(a == b);
    }
}
2个回答

5
不是的,基本上不是。 == 使用静态分析,因此将使用对象 ==。听起来您需要使用object.Equals(x,y)(如果您知道两者都不为空)或者x.Equals(y),这将使用多态性。

1
作为一个有趣的点,不让运算符具有多态性的原因是什么?在我看来,多态性会更直观。 - Welbog
1
此外,多态性会使在运算符中使用空值更加困难。 - Marc Gravell
有什么我可以在MyDataClass中做的以便case1可以使用自定义逻辑(数据比较而非实例),就像==运算符中定义的那样? - dotnetcoder
Eric在这篇文章中做得非常好 http://blogs.msdn.com/ericlippert/archive/2009/04/09/double-your-dispatch-double-your-fun.aspx - ShuggyCoUk
甚至还包括套管设计 ;-p http://blogs.msdn.com/ericlippert/archive/2009/03/05/what-are-the-horns-for.aspx - Marc Gravell
显示剩余4条评论

1

以下是如何重写Equals和==运算符的描述:

http://msdn.microsoft.com/en-us/library/ms173147(VS.80).aspx

这就是它的样子(假设您已经重载了Equals()):

public static bool operator ==(MyDataClass a, MyDataClass 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;
    }

    // Otherwise use equals
    return a.Equals(b);
}

public override bool Equals(System.Object obj)
{
    // If parameter is null return false.
    if (obj == null)
    {
        return false;
    }

    // If parameter cannot be cast to MyDataClass return false.
    MyDataClass p = obj as MyDataClass;
    if ((System.Object)p == null)
    {
        return false;
    }

    return (x == p.x);
}

operator == 中测试 b 是否为 null 是不必要的:因为这已经在 Equals 中完成了。你可以(隐式地)委托测试。另外,为什么要将 object.ReferenceEquals(x, y)(object)x == (object)y 混合使用?保持一致性。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接