当对象被装箱时,==运算符重载

时间:2009-04-09 11:44:33

标签: c#

以下代码的输出如下:

不等于
等于

注意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 个答案:

答案 0 :(得分:5)

不,基本上。 ==使用静态分析,因此将使用对象==。听起来你需要使用object.Equals(x,y)代替(x.Equals(y)如果你知道它们都不是null),它使用多态性。

答案 1 :(得分: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);
}