C# 重载运算符给出不同的结果

C# overload operator gives different results

为我自定义的 类 向量和矩阵之间的数学运算编写代码我遇到了一个奇怪的(至少对我而言)问题。

类型之间的重载运算符在不同的地方给出不同的结果。我发现操作的结果对如何在 "operator +(...)".

中创建新实例很敏感

我创建了显示差异的简单代码(见下文)。 两个 类 正在做同样的事情并且预期结果相同,但实际上并不相同。 Type2 的重载运算符和函数 "test" 修改变量。 我在 MSDN 中没有发现任何关于此的警告。此行为未直接通过语法标记(f.e。通过 "ref" 关键字)。

任何人都可以推荐一个关于这个问题的 link 吗? 是预测行为还是 C# 语法错误?

using System;

namespace test_operator_overload
{
    class Program
    {
        static void Main()
        {
            Type1 A1 = new Type1(1);
            Console.WriteLine(A1);          // 1 - OK
            Console.WriteLine(A1 + A1);     // 2 - OK
            Console.WriteLine(A1);          // 1 - OK

            Console.WriteLine();

            Type2 B1 = new Type2(1);
            Console.WriteLine(B1);          // 1 - OK
            Console.WriteLine(B1 + B1);     // 2 - OK
            Console.WriteLine(B1);          // 2 - Not OK

            Console.WriteLine();

            Type2 C1 = new Type2(1);
            Console.WriteLine(C1);          // 1 - OK
            Console.WriteLine(test(C1));    // 2 - OK
            Console.WriteLine(C1);          // 2 - Not OK
        }

        static Type2 test(Type2 a)
        {
            a.x += 1;
            return a;
        }
    }



    class Type1
    {
        public double x;

        public Type1(double x)
        {
            this.x = x;
        }

        public static Type1 operator +(Type1 a, Type1 b)
        {
            return new Type1(a.x + b.x);
        }

        public override string ToString() { return GetType().Name + " (" + x + ")"; }
    }


    class Type2
    {
        public double x;

        public Type2(double x)
        {
            this.x = x;
        }

        public static Type2 operator +(Type2 a, Type2 b)
        {
            a.x += b.x;
            return a;
        }

        public override string ToString() { return GetType().Name + " (" + x + ")"; }
    }
}

你的 Type2 的 + 运算符很无聊,你不应该修改运算符中的输入。

运算符通过组合输入并返回新结果来对输入进行操作。