【发布时间】:2016-02-04 22:45:13
【问题描述】:
为我的自定义向量和矩阵类之间的数学运算编写代码我遇到了一个奇怪的(至少对我而言)问题。
类型之间的重载运算符在不同的地方给出不同的结果。我发现操作的结果对如何在“运算符+(...)”中创建新实例很敏感。
我创建了显示差异的简单代码(见下文)。 两个班级正在做同样的事情,并且预期的结果相同,但实际上并不相同。 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 + ")"; }
}
}
【问题讨论】:
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
-
改变操作符中的参数势必会引起混淆。没有人预料到运营商会产生这些副作用。
-
您的
clsB运算符没有创建新实例。它们在表达式求值期间改变您的操作数的属性。因此,B2的属性,在其表达式中使用了两次,对于两个不同的操作具有不同的值。 -
@mybirthname 旁注:对于 cmets 使用
[ MCVE ](无空格)来获取文本链接。还给你额外的字符:) -
关于主题:请查看Why mutable structs are evil - 正如@mikez 所说,这是一个非常糟糕的主意,与
float和其他.numeric 类型上的常规运算符完全不同。
标签: c# operator-overloading reference-type