如何调用 == 运算符来调用子级的实现?

发布于 2024-12-28 02:24:11 字数 523 浏览 0 评论 0原文

我有

public abstract class DataClass
{
    public static bool operator ==(DataClass left, DataClass right)
    {
        return left.Equals(right);
    }
}

,这就是发生的情况

object left = new DataClass();
object right = new DataClass();
bool expected = true;
bool actual;
actual = ((DataClass)left) == ((DataClass)right);
Assert.AreEqual(expected, actual); // passes
actual = left == right;
Assert.AreEqual(expected, actual); // fails

如何让它调用正确的实现,而不需要显式地转换它?

I have

public abstract class DataClass
{
    public static bool operator ==(DataClass left, DataClass right)
    {
        return left.Equals(right);
    }
}

and this is what happens

object left = new DataClass();
object right = new DataClass();
bool expected = true;
bool actual;
actual = ((DataClass)left) == ((DataClass)right);
Assert.AreEqual(expected, actual); // passes
actual = left == right;
Assert.AreEqual(expected, actual); // fails

How to make it call the right implementation, without casting it explicitly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

魂归处 2025-01-04 02:24:11

静态方法不受多态行为的影响(即它们不能被覆盖)。需要演员阵容。

有关可能的解决方法,请参阅此相关问题:覆盖静态方法

很可能您将不得不求助创建实例方法或重写 Equals

static methods are not subject to polymorphic behavior (i.e. they cannot be overriden). The cast is required.

For a possible workaround see this related question: Override a static method

Most likely you will have to resort to creating an instance method or overriding Equals instead.

孤星 2025-01-04 02:24:11

您不能这样做,因为运算符是静态的,并且根据定义它们不能是虚拟的/重写的。

如果我遇到同样的问题,我最终会重写 bool Equals(object o) 并使用该方法而不是运算符。如果这不是一个选择,那么演员阵容是必要的。

You can't do that as operators are static and by definition they can not be virtual / overriden.

In cases where I've had the same issue I ended up overriding bool Equals(object o) and using the method instead of the operator. If that is not an option then the cast is necessary.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文