我定义了一个结构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); }
}
名称ICoordsCanon
为 ,ICoordsUser
和ICoordsCustom
. 然后我在结构上定义了价值平等,如下所示:
#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
但是,当我在其中一种接口类型的值之间使用==运算符执行相等比较时,如
if (coordsUser1 == userCoords2) { /* whatever */ }
始终使用object.==进行参考比较。有谁知道在这种情况下如何使用 C#将值相等强制到==运算符上?
提前感谢您的任何想法或建议。
[编辑] 在上面的示例中,coordsUser1和userCoords2都是存储在 ICoordsUser 类型变量中的Coords实例,所以我不清楚为什么不使用==的定义覆盖。