在c#中显式接口实现==运算符
本文关键字:运算符 显式接口实现 | 更新日期: 2023-09-27 18:01:28
我定义了一个结构体 coord ,它显式地实现了三个接口,每个接口都是这样定义的:
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
。然后我在结构体上定义了Value equal,如下所示:
#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 */ }
使用对象进行引用比较。总是执行==。有人知道我怎么能强制值相等到==操作符在这种情况下,使用c# ?
提前感谢您的任何想法或建议。
[编辑]在上面的例子中,coordsUser1和 usercoord2 都是存储在类型为ICoordsUser的变量中的Coords的实例,所以我不清楚为什么没有使用==的定义覆盖。
由于不能为接口定义静态成员,因此不能在接口上定义操作符。因为操作符重载是在编译时解决的,所以编译器不会看到任何与给定接口类型的签名匹配的==
操作符。由于Object
为对象定义了==
操作符,并且在编译时没有更好的匹配,因此它将使用该操作符。
有三种方法可以解决这个问题:
-
将左侧对象强制转换为定义
==
操作符的类型return (Coords)coordsUser1 == userCoords2;
-
使用正常的
Equals(object)
方法。但是,这将框住结构。return coordsUser1.Equals(userCoords2);
-
强制你的接口实现
IEquatable<T>
,并使用通用的Equals(T)
(这减少了装箱)return coordsUser1.Equals(userCoords2);