【发布时间】:2015-04-24 07:15:48
【问题描述】:
美好的一天。我在 C# 中使用 Ububntu 14.04 下的 Mono 实现 Complex 类。当我绑定实现双精度和复数之间的乘法时,我发现了一些奇怪的行为。 我的复杂实现类似于
using System;
namespace Mynamespace {
public class Complex {
public double re;//Real part
public double im;//Imaginary part
public Complex (double a, double b){
re = a;
im = b;
}
public static Complex operator *(double k, Complex x){
return new Complex (k * x.re, k * x.im);
}
}}
测试代码是这样的
...
Complex a = new Complex (1, 1);
double b = 2.0;
Complex c = b * a;
...
奇怪的行为是操作符 * 返回了错误的结果。我注意到当 * 被调用时, double 类型的参数在函数中具有错误的值(我通过 b = 2 并且我看到参数 k 具有随机值)。
我也尝试过不使用运算符来实现该功能:
...
public Complex Multiply(double k){
return new Complex (k * re, k * im)
}
...
还有
...
public static Complex Multiply (double k, Complex x){
return new Complex (k * x.re, k * x.im)
}
...
但我总是得到相同的行为。 我已经在 .net (Windows7) 中的 C# 下尝试过,一切正常。
有人对如何修复它有任何建议吗?
最好的问候
费德里科
【问题讨论】:
-
您必须提供重现您行为的代码。我没有 Mono,但我很确定这不会(如果通过
doubles 不起作用,有人会注意到)。此外,当您可以使用静态方法重现它时,显然与运算符重载无关。另外,请注意,传递的值非常不太可能具有 random 值 - 堆栈和堆都已预置零,因此即使您以某种方式引用了未初始化的值,它很可能为零,而不是“随机”。您是否可能在带有闭包的匿名方法中使用乘法? -
我报告的代码产生了我描述的问题。确实,实际传递给乘法函数的值不是随机的,但这不是我要传递的值。非常奇怪的想法是,Visual Studio C# 中的相同代码给出了正确的结果。
-
什么版本的 Mono?我用 MonoDevelop 5.7 (Mono 3.12.1) 对此进行了测试,它完全符合预期。您所描述的行为在语言和运行时的良好运行部分中是一个基本缺陷,恕我直言,唯一合理的解释是您安装的 Mono 或相关软件已损坏,或者您误解了您的观察结果,并且您使用的代码与您在此处发布的代码不完全相同。
-
我已经在 MonoDevelop 5.7 广告中很好地尝试过了。该代码正是报道的女士广告。如果我尝试在两个 Complex 之间重载二元运算符 * ,则一切正常。当我在 double 和 Complex 之间使用运算符时,会出现唯一的奇怪行为。我将尝试重新安装所有内容。谢谢
-
您使用的是什么操作系统?这也发生在 Windows 上吗?您的
Complex类是否有隐式强制转换运算符重载?这是非常可疑的。也许您应该向 Mono 团队报告错误?
标签: c# mono operator-overloading