【问题标题】:Does C# operator overloading support "+=" like C++? [duplicate]C# 运算符重载是否像 C++ 一样支持“+=”? [复制]
【发布时间】:2019-10-22 23:34:00
【问题描述】:

我来自 C++ 并使用 C# 作为新手,刚刚尝试过:

class Class1
{
    int mI = 0;
    string mS = "ab";

    public static Class1 operator + (Class1 obj1, Class1 obj2)
    {
        return new Class1()
        {
            mI = obj1.mI + obj2.mI,
            mS = obj1.mS + obj2.mS
        };
    }

    public static void operator += (Class1 obj1)
    {
        mI += obj1.mI;
        mS += obj1.mS;
    }
}

发现operator+=函数编译不通过,说:

错误 CS1019:需要可重载的一元运算符。

所以 C# 根本不做这种运算符重载?

【问题讨论】:

  • 能够做到这一点有什么用?覆盖 + 运算符给出相同的结果。
  • RTFM: "赋值运算符不能显式重载。但是,当您重载二元运算符时,相应的赋值运算符(如果有)也会被隐式重载。例如,+=使用 + 进行评估,可以重载。”
  • @Franck C++ 程序员通常重载operator+=,然后用它重载operator+。这是 C++ Primer 中的一个提示:“定义算术运算符和相关复合赋值的类通常应该使用复合赋值来实现算术运算符。”
  • 我来自 C++ 并且使用 C# 作为新手 -- 不要使用 C++ 作为模型来编写 C# -- 编写代码的滑坡(或希望编写基于另一种语言的一种语言的代码)会慢慢渗透进来。所有这些只会让精通 C# 的人发现您编写的代码看起来很奇怪、不同,并且可能有细微的错误。反之亦然——不要使用 C# 作为模型编写 C++ 代码。

标签: c# c++ overloading operator-keyword


【解决方案1】:

您可以重载+,但不能重载+=,如per the documentation:

赋值运算符不能显式重载。但是,当您重载二元运算符时,相应的赋值运算符(如果有)也会被隐式重载。例如,+= 使用 + 评估,可以重载。

因此,如您所见,+= 被视为x = x + y。这就是为什么不允许重载+= 运算符的原因。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2012-02-11
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多