如果接口继承IEquatable,则实现类可以定义Equals方法的行为。是否可以定义==操作的行为?
public interface IFoo : IEquatable
{}
public class Foo : IFoo
{
// IEquatable.Equals
public bool Equals(IFoo other)
{
// Compare by value here...
}
}
通过比较它们的值来检查两个IFoo引用是否相等:
IFoo X = new Foo();
IFoo Y = new Foo();
if (X.Equals(Y))
{
// Do something
}
是否可以让if (X == Y)
在Foo上使用Equals方法?
答案 0 :(得分:6)
否 - 您无法在接口中指定运算符(主要是因为运算符是静态的)。编译器确定哪个==的重载基于它们的静态类型进行调用(即不涉及多态),并且接口不能指定代码来说“返回调用X.Equals(Y)的结果”。
答案 1 :(得分:0)
不,因为接口不能包含运算符函数。一个解决方案是使IFoo成为抽象类而不是接口:
abstract class IFoo : IEquatable<IFoo>
{
public static bool operator ==(IFoo i1, IFoo i2) { return i1.Equals(i2); }
public static bool operator !=(IFoo i1, IFoo i2) { return !i1.Equals(i2); }
public abstract bool Equals(IFoo other);
}
class Foo : IFoo
{
public override bool Equals(IFoo other)
{
// Compare
}
}
当然,这会让您失去界面提供的灵活性。