【问题标题】:Mono - Issue with binary operator between two different typesMono - 两种不同类型之间的二元运算符问题
【发布时间】: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


【解决方案1】:

我已经解决了类似的问题

public static Complex operator *(object k, complex x){
return new ((double)k * x.re, (double)k * x.im);
}

现在一切正常。如果您对理解我遇到的问题有任何建议,我们都欢迎。

最好的问候

费德里科

【讨论】:

  • 我发现问题只是在调试时出现,而在正常执行时一切正常。
猜你喜欢
  • 2021-10-02
  • 2013-12-24
  • 2020-02-09
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多