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

C#重载运算符给出不同的结果,c#,operator-overloading,reference-type,C#,Operator Overloading,Reference Type,在编写自定义向量类和矩阵类之间的数学运算代码时,我遇到了一个奇怪的问题(至少对我来说是这样) 类型之间的重载运算符在不同的位置给出不同的结果。我发现操作的结果对如何在“operator+(…)中创建新实例很敏感 我已经创建了显示差异的简单代码(见下文)。 两个班级在做同样的事情,预期的结果是一样的,但实际上不一样。 类型2的重载运算符和函数“test”修改变量。 我在MSDN中没有发现任何关于此的警告。此行为不直接由语法标记(例如,“ref”关键字) 有人能推荐一个关于这个问题的链接吗? 这是预

在编写自定义向量类和矩阵类之间的数学运算代码时,我遇到了一个奇怪的问题(至少对我来说是这样)

类型之间的重载运算符在不同的位置给出不同的结果。我发现操作的结果对如何在“operator+(…)中创建新实例很敏感

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

有人能推荐一个关于这个问题的链接吗? 这是预测行为还是C#语法中的错误


Type2
的+运算符已禁用,不应修改运算符中的输入


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

寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小的、完整的和可验证的示例。在运算符中改变参数必然会导致混淆。没有人期望操作符会产生这些副作用。您的
clsB
操作符没有创建新实例。它们在表达式求值期间更改操作数的属性。因此,
B2
的属性(在其表达式中使用了两次)对于两种不同的操作具有不同的值。@mybirthname侧注:对于注释,请使用
[MCVE]
(无空格)来获取与文本的链接。还提供了额外字符:)关于主题:请检查-正如@mikez所说,这是一个非常糟糕的主意,与
float
和其他.numeric类型上的常规运算符完全不同。是的,我已经将struct应用于所有使用重载运算符的类。现在速度快了30%。但我在示例中解释的问题仍然不清楚。正如MSDN中提到的:“…当控件传回调用过程时,更改的值将不会保留。”在我的示例中,当我使用重载运算符或调用函数“test”时,参数值在控件传回调用过程后更改。所以怎么了?它完全按照你的要求做了。添加输入,然后将其中一个输入值设置为等于结果。。运算符与函数没有什么不同,因为它们通过引用获取输入,并且可以修改它们的值。文档@Dennis指的是按值传递与按引用传递,而不是“传递引用”,因此尽管他引用的文档在技术上是正确的,但与他的问题无关。
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 + ")"; }
    }
}