以下代码的输出如下:
不等于
等于
注意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);
}
}
答案 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);
}