C# - 无法覆盖 ==

C# - Can't override ==

我有以下 class(为 Unity 游戏引擎构建)

using System;
using System.Collections.Generic;
using UnityEngine;

public class Biome : ScriptableObject, IEquatable<Biome>
{
    // ...

    //
    // IEquatable
    //

    public bool Equals(Biome other)
    {
        if (other == null)
            return false;

        return this.name == other.name;
    }

    public override bool Equals(object obj)
    {
        if (obj == null) return false;

        Biome other = obj as Biome;

        if (other == null) return false;

        return Equals(other);
    }

    public override int GetHashCode()
    {
        return this.name.GetHashCode();
    }

    public static bool operator ==(Biome biome1, Biome biome2)
    {
        if (object.ReferenceEquals(biome1, biome2)) return true;
        if (object.ReferenceEquals(null, biome1)) return false;
        if (object.ReferenceEquals(null, biome2)) return false;

        return biome1.Equals(biome2);
    }

    public static bool operator !=(Biome biome1, Biome biome2)
    {
        if (object.ReferenceEquals(biome1, biome2)) return false;
        if (object.ReferenceEquals(biome1, null)) return true;
        if (object.ReferenceEquals(biome2, null)) return true;

        return !biome1.Equals(biome2);
    }
}

当我尝试进行测试时,函数 Equals 似乎可以正常工作,但运算符 == 给出了不同的结果。

    [Test]
    public void FooTest()
    {
        ScriptableObject biome1 = ScriptableObject.CreateInstance("Biome");
        ScriptableObject biome2 = ScriptableObject.CreateInstance("Biome");

        biome1.name = "Biome #1";
        biome2.name = "Biome #1";

        Assert.IsTrue(biome1.Equals(biome2));
        Assert.IsTrue(biome1 == biome2);  // This one fails

    }

我的实现有问题吗?

更新: 这是完整的 class,以防有所不同:https://www.hastebin.com/divazubero.cpp

问题是你的变量是 ScriptableObject 类型,而不是 Biome.

类型

编译器必须在编译时决定调用哪个重载。并且由于它在编译时不知道 运行 时类型将是 Biome,因此它发出对 ScriptableObject.[=33 的 == 运算符的调用=] 如果 class 没有覆盖的 == 运算符,则调用 object 的运算符(它执行一个简单的 ReferenceEquals,当然是 false) .

== 运算符重载 不是 virtual.

如果您在测试中使用 specific 类型 Biome,它将按预期工作。