namespace Foo {
class Program
{
static void Main(string[] args)
{
B a = new B();
B b = new B();
A x = a;
A y = b;
a.value = 1;
b.value = 1;
a.value2 = 1;
b.value2 = 2;
Console.WriteLine("a == b == {0}", a == b);
Console.WriteLine("x == y == {0}", x == y);
Console.ReadKey();
//System.Windows.Forms.Application.Run(new Form1());
}
}
public class A {
public int value;
public override int GetHashCode()
{
return value.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (!(obj is A)) return false;
A other = (A)obj;
return this.value == other.value;
}
public static bool operator == (A x, A y) {
return x.value == y.value;
}
public static bool operator !=(A x, A y)
{
return x.value != y.value;
}
}
public class B : A {
public int value2;
public override int GetHashCode()
{
return value.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (!(obj is B)) return false;
B other = (B)obj;
return this.value == other.value && this.value2 == other.value2;
}
public static bool operator ==(B x, B y)
{
return x.value == y.value && x.value2 == y.value2;
}
public static bool operator !=(B x, B y)
{
return x.value != y.value && x.value2 == y.value2;
}
}
}