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
,它将按预期工作。
我有以下 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
,它将按预期工作。