试图为我的结构定义一个 == 和 != 运算符,但我不断得到 "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);
}

为了找到预先存在的答案,我调查了以下链接:

我的所有其他运算符都工作正常,但是当我尝试比较 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) { ... }