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
的 + 运算符很无聊,你不应该修改运算符中的输入。
运算符通过组合输入并返回新结果来对输入进行操作。
为我自定义的 类 向量和矩阵之间的数学运算编写代码我遇到了一个奇怪的(至少对我而言)问题。
类型之间的重载运算符在不同的地方给出不同的结果。我发现操作的结果对如何在 "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
的 + 运算符很无聊,你不应该修改运算符中的输入。
运算符通过组合输入并返回新结果来对输入进行操作。