C# 二元运算符在两种不同类型之间的单值问题

C# 二元运算符在两种不同类型之间的单值问题,c#,mono,operator-overloading,C#,Mono,Operator Overloading,你好。我正在UBNTU 14.04下用Mono实现C#中的复杂类。当我绑定到实现double和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

你好。我正在UBNTU 14.04下用Mono实现C#中的复杂类。当我绑定到实现double和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);
}
}}
public static Complex operator *(object k, complex x){
return new ((double)k * x.re, (double)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)
}
...
但我得到阿尔维斯同样的行为。 我在C#in.net(Windows7)下试用过,一切都很好

有人对如何修复它有什么建议吗

致意


费德里科

我用类似的方法解决了这个问题

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);
}
}}
public static Complex operator *(object k, complex x){
return new ((double)k * x.re, (double)k * x.im);
}
现在一切正常。如果你对我遇到的问题有什么建议,我们都欢迎

致意


Federico

您必须提供再现您行为的代码。我没有单声道,但我很确定这不会(如果传递
double
s不起作用,有人会注意到)。另外,当您可以使用静态方法复制它时,显然与运算符重载无关。另外,请注意,传递的值不太可能有随机值-堆栈和堆都是预置零的,因此即使您以某种方式引用了一个单位化的值,它也很可能是零,而不是“随机”。您是否在匿名方法中使用带闭包的乘法?我报告的代码产生了我描述的问题。实际上,传递给乘法函数的值不是随机的,但它不是我想要传递的值。非常奇怪的是,Visual Studio C#中的相同代码给出了正确的结果。Mono的哪个版本?我用MonoDevelop 5.7(Mono3.12.1)测试了这一点,它完全按照预期工作。您所描述的行为是语言和运行时中运行良好的部分中的一个基本缺陷,因此我认为唯一合理的解释是您安装的Mono或相关软件已损坏,或者你误解了你的观察结果,并且你使用的代码与你在这里发布的不完全一样。我已经在MonoDevelop 5.7 ad中试过了。代码正是广告报道的那位女士。如果我尝试在两个复杂的函数之间重载二进制运算符*,一切都会正常工作。当我在double和Complex之间使用操作符时,唯一的strage行为出现了。我会尝试重新安装一切。谢谢你在用什么操作系统?Windows上也会发生这种情况吗?您的
复杂类是否有隐式强制转换操作符重载?这是难以置信的可疑。也许你应该向Mono团队报告一个bug?我发现问题只在调试期间出现,而在正常执行时一切都正常。