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

时间:2016-02-04 22:45:14

标签: c# operator-overloading reference-type

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

类型之间的重载运算符在不同的位置给出不同的结果。我已经挖出了操作的结果对于如何在“operator +(...)”中创建新实例敏感。

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

有人可以推荐有关此问题的链接吗? 是预测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 + ")"; }
    }
}

1 个答案:

答案 0 :(得分:1)

您{+ 1}}的+运算符是borked,您不应修改运算符中的输入。

操作员通过组合输入操作输入,返回新结果。