【发布时间】:2015-03-22 13:42:41
【问题描述】:
我有以下。它按预期工作:
using System;
namespace Whatever {
public class DoubleWrapper {
public double Payload { get; set; }
public DoubleWrapper(double payload) {
this.Payload = payload;
}
public static implicit operator DoubleWrapper(double x) {
DoubleWrapper r = new DoubleWrapper(x);
return r;
}
public static implicit operator double(DoubleWrapper wrapper) {
double r = wrapper.Payload;
return r;
}
public DoubleWrapper Times(DoubleWrapper multiplyByMe) {
DoubleWrapper r = this * multiplyByMe; // does compile
return r;
}
}
}
但是,如果我将“double”替换为“Complex”,则会出现编译错误:
using System;
using System.Numerics;
namespace Whatever {
public class ComplexWrapper {
public Complex Payload { get; set; }
public ComplexWrapper(Complex payload) {
this.Payload = payload;
}
public static implicit operator ComplexWrapper(Complex x) {
ComplexWrapper r = new ComplexWrapper(x);
return r;
}
public static implicit operator Complex(ComplexWrapper wrapper) {
Complex r = wrapper.Payload;
return r;
}
public ComplexWrapper Times(ComplexWrapper multiplyByMe) {
ComplexWrapper r = this * multiplyByMe; // ERROR: Operator '*' cannot be applied to operands of type Whatever.ComplexWrapper and Whatever.ComplexWrapper.
return r;
}
解决方法并不难——我可以像这样替换该行:
ComplexWrapper r = this.Payload * multiplyByMe; //WORKS
我确实验证了 * 符号对 double 和 System.Numerics.Complex 都有效。确实如此:
namespace SomewhereElse { // different namespace
public static class TestTimes { // builds just fine
public static void Products() {
double x1 = 4;
double x2 = 5;
double product = x1 * x2;
Complex z1 = new Complex(3, 4);
Complex z2 = new Complex(3, -4);
Complex zProduct = z1 * z2;
}
}
}
为什么构建了我的 DoubleWrapper 类,但没有构建我的 ComplexWrapper?
【问题讨论】:
标签: c# type-conversion operators