C# 中的重写运算符

问题描述 投票:0回答:1

我尝试覆盖 -- 运算符。 我想要前缀和后缀 -- 运算符 但c#不允许,即使有不同的签名功能。 代码:

public static Rational operator --(Rational a)
{
    a.Mona -= a.Mechane;
    return a.reduce();
}
public static Rational operator --(Rational a, int _)
{
    _ = 0;
    Rational original = new Rational(a.Mona, a.Mechane);
    a.Mona -= a.Mechane;
    a.reduce();
    return original;
}

错误:

Overloadable binary operator expected

我尝试做两个运算符

c# operator-overloading
1个回答
0
投票

在 C# 中,一元递增/递减运算符应返回新值,而不是改变其操作数。你想做的事情是不可能的。 12.9.6 C# 规范中的前缀递增和递减运算符

可以使用后缀或前缀表示法来调用运算符

++
或运算符
--
实现。这两种表示法不可能有单独的运算符实现。

相反,您可以实现一个命名方法来就地操作:

public Rational Decrement()
{
    this.Mona -= this.Mechane;
    return this.reduce();
}

并重复使用它:

public static Rational operator --(Rational a)
{
    var r = new Rational(a.Mona, a.Mechane);
    r.Decrement();
    return r;
}

这里有问题:

  • 如果您确实提供了
    operator --
    ,很容易意外地使用低效的前缀递减而不是
    .Decrement()
  • Decrement
    的返回类型可能会导致用户相信它返回一个新值,而不是用于链接

但是如果您对这些权衡不满意,则必须以其他方式解决它们。

© www.soinside.com 2019 - 2024. All rights reserved.