Простой ответ:
У вас есть List<I>
, и вы сравниваете два I
друг с другом. Поскольку interface I
не реализует (и не может) реализовывать оператор сравнения, объекты сравниваются по ссылке.
Вместо этого вы можете использовать абстрактный базовый класс:
public interface I
{
}
public abstract class AbstractI : I
{
public static bool operator ==(AbstractI left, I right)
{
return left.equals(right); //TODO can be null
}
public static bool operator !=(AbstractI left, I right)
{
return !left.equals(right);
}
protected abstract bool equals(I other);
}
public class A : AbstractI
{
protected override bool equals(I other)
{
//TODO your compare code here
throw new NotImplementedException();
}
}
public class B : AbstractI
{
protected override bool equals(I other)
{
//TODO your compare code here
throw new NotImplementedException();
}
}
List<AbstractI> l = new List<AbstractI>(){
new A(),
new B()
};
var x = l[0] == l[1];