试图为我的结构定义一个 == 和 != 运算符,但我不断得到 "Operator `==' cannot be applied to operands..."
Trying to define a == and != operator for my struct, but I keep getting the "Operator `==' cannot be applied to operands..."
我正在尝试实现笛卡尔二维整数坐标系。我设法让 +、-、* 和 / 运算符正常工作。但是,在以同样的方式实现 == 运算符后,我遇到了错误。
我的结构定义如下:
public struct IntVector2 : IEquatable<IntVector2>
{
// properties
public int x { get; private set; }
public int y { get; private set; }
// constructors
public IntVector2(int x, int y)
{
this.x = x;
this.y = y;
}
// I have removed the XML documentation and operator definitions here
}
注意:我根据 .NET 指南实施了 .Equals
和 .GetHashCode
。因此 IEquateable<IntVector2>
我还在结构体中定义了以下运算符(以及更多):
public static bool operator ==(IntVector2 a, Vector2 b)
{
return (a.x == b.x && a.y == b.y);
}
public static bool operator != (IntVector2 a, Vector2 b)
{
return !(a == b);
}
// Once again I removed the XML documentation
并且以下覆盖:
public override bool Equals(object obj)
{
if (!(obj is IntVector2))
{
return false;
}
IntVector2 intVect2 = (IntVector2)obj;
return (x == intVect2.x && y == intVect2.y);
}
public override int GetHashCode()
{
return (x * 31 + y);
}
为了找到预先存在的答案,我调查了以下链接:
Can't operator == be applied to generic types in C#?
https://coding.abel.nu/2014/09/net-and-equals/ --- 信息和
使用相等运算符的演示
msdn.microsoft.com/en-us/library/c35t2ffz.aspx --- 相等运算符
msdn.microsoft.com/en-us/library/7h9bszxx(v=vs.100).aspx --- MSDN
实施相等运算符的指南
我的所有其他运算符都工作正常,但是当我尝试比较 2 IntVector2
的相等性时,出现错误。例如:
void Foo(IntVector2 intVectA, IntVector2 intVectB)
{
if (intVectA.Equals(intVectB))
{
IntVector2 C = intVectA + intVectB;
bool isEqual = intVectA == intVectB;
}
}
报错
Operator '==' cannot be applied to operands of type 'IntVector2' and
'IntVector2'
对于上下文,我将其用作学习经验。没有它我可以逃脱(使用 intVectA.x == intVectB.x && intVectA.y == intVectB.y
),但如果我只是解决这个问题,我永远不会知道为什么这是一个错误。
此外,我的结构编译完全没有任何错误。
您正在尝试将 IntVector2
与另一个 IntVector2
进行比较,但是 ==
和 !=
运算符的实现采用 IntVector2
和一个Vector2
。在您的问题中,我没有看到任何其他提及 class 或名为 Vector2
的结构。那是错字吗?如果我将它们更改为:
,则运算符对我来说工作正常
public static bool operator ==(IntVector2 a, IntVector2 b) { ... }
public static bool operator !=(IntVector2 a, IntVector2 b) { ... }
我正在尝试实现笛卡尔二维整数坐标系。我设法让 +、-、* 和 / 运算符正常工作。但是,在以同样的方式实现 == 运算符后,我遇到了错误。
我的结构定义如下:
public struct IntVector2 : IEquatable<IntVector2>
{
// properties
public int x { get; private set; }
public int y { get; private set; }
// constructors
public IntVector2(int x, int y)
{
this.x = x;
this.y = y;
}
// I have removed the XML documentation and operator definitions here
}
注意:我根据 .NET 指南实施了 .Equals
和 .GetHashCode
。因此 IEquateable<IntVector2>
我还在结构体中定义了以下运算符(以及更多):
public static bool operator ==(IntVector2 a, Vector2 b)
{
return (a.x == b.x && a.y == b.y);
}
public static bool operator != (IntVector2 a, Vector2 b)
{
return !(a == b);
}
// Once again I removed the XML documentation
并且以下覆盖:
public override bool Equals(object obj)
{
if (!(obj is IntVector2))
{
return false;
}
IntVector2 intVect2 = (IntVector2)obj;
return (x == intVect2.x && y == intVect2.y);
}
public override int GetHashCode()
{
return (x * 31 + y);
}
为了找到预先存在的答案,我调查了以下链接:
Can't operator == be applied to generic types in C#?
https://coding.abel.nu/2014/09/net-and-equals/ --- 信息和 使用相等运算符的演示
msdn.microsoft.com/en-us/library/c35t2ffz.aspx --- 相等运算符
msdn.microsoft.com/en-us/library/7h9bszxx(v=vs.100).aspx --- MSDN 实施相等运算符的指南
我的所有其他运算符都工作正常,但是当我尝试比较 2 IntVector2
的相等性时,出现错误。例如:
void Foo(IntVector2 intVectA, IntVector2 intVectB)
{
if (intVectA.Equals(intVectB))
{
IntVector2 C = intVectA + intVectB;
bool isEqual = intVectA == intVectB;
}
}
报错
Operator '==' cannot be applied to operands of type 'IntVector2' and 'IntVector2'
对于上下文,我将其用作学习经验。没有它我可以逃脱(使用 intVectA.x == intVectB.x && intVectA.y == intVectB.y
),但如果我只是解决这个问题,我永远不会知道为什么这是一个错误。
此外,我的结构编译完全没有任何错误。
您正在尝试将 IntVector2
与另一个 IntVector2
进行比较,但是 ==
和 !=
运算符的实现采用 IntVector2
和一个Vector2
。在您的问题中,我没有看到任何其他提及 class 或名为 Vector2
的结构。那是错字吗?如果我将它们更改为:
public static bool operator ==(IntVector2 a, IntVector2 b) { ... }
public static bool operator !=(IntVector2 a, IntVector2 b) { ... }