Pie*_*ens 1 c# equality interface operator-overloading
我已经定义了一个struct Coords,它显式地实现了三个接口,每个接口定义如下:
public partial struct Coords
{
int ICoordsUser.X { get { return VectorUser.X; } }
int ICoordsUser.Y { get { return VectorUser.Y; } }
IntVector2D ICoordsUser.Vector { get { return VectorUser; }
set { VectorUser=value; } }
ICoordsCanon ICoordsUser.Canon { get { return this; } }
ICoordsUser ICoordsUser.Clone() { return NewUserCoords(VectorUser); }
string ICoordsUser.ToString() { return VectorUser.ToString(); }
IEnumerable<NeighbourCoords> ICoordsUser.GetNeighbours(Hexside hexsides) {
return GetNeighbours(hexsides);
}
int ICoordsUser.Range(ICoordsUser coords) { return Range(coords.Canon); }
}
Run Code Online (Sandbox Code Playgroud)
与名字ICoordsCanon,ICoordsUser和ICoordsCustom.然后我在结构上定义了Value Equality,如下所示:
#region Value Equality
bool IEquatable<Coords>.Equals(Coords rhs) { return this == rhs; }
public override bool Equals(object rhs) {
return (rhs is Coords) && this == (Coords)rhs;
}
public static bool operator == (Coords lhs, Coords rhs) {
return lhs.VectorCanon == rhs.VectorCanon;
}
public static bool operator != (Coords lhs, Coords rhs) { return ! (lhs == rhs); }
public override int GetHashCode() { return VectorUser.GetHashCode(); }
bool IEqualityComparer<Coords>.Equals(Coords lhs, Coords rhs) { return lhs == rhs; }
int IEqualityComparer<Coords>.GetHashCode(Coords coords) {
return coords.GetHashCode();
}
#endregion
Run Code Online (Sandbox Code Playgroud)
但是,当我在其中一个接口类型的值之间执行与==运算符的相等比较时,如
if (coordsUser1 == userCoords2) { /* whatever */ }
Run Code Online (Sandbox Code Playgroud)
使用对象的参考比较.==总是执行.有没有人知道如何在这种情况下使用C#强制将值相等于==运算符?
提前感谢您的任何想法或建议.
[编辑]在上面的例子中,两个coordsUser1和userCoords2是实例COORDS存储在类型的变量ICoordsUser,为什么所定义的覆盖它是我不清楚==不被使用.
由于无法为接口定义静态成员,因此无法在接口上定义运算符.因为在编译时解析了运算符重载,所以编译器将看不到任何==与给定接口类型的签名匹配的运算符.由于为对象Object定义了==运算符,并且在编译时没有更好的匹配,因此它将使用该对象.
有三种方法可以解决这个问题:
将左侧对象转换为定义==运算符的类型.
return (Coords)coordsUser1 == userCoords2;
Run Code Online (Sandbox Code Playgroud)使用常规Equals(object)方法.但是,这会打包你的结构.
return coordsUser1.Equals(userCoords2);
Run Code Online (Sandbox Code Playgroud)强制你的接口实现IEquatable<T>,并使用泛型Equals(T)(减少拳击).
return coordsUser1.Equals(userCoords2);
Run Code Online (Sandbox Code Playgroud)