* 运算符和类型转换器

3
我有以下的代码,它按预期工作:
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

我已经验证了星号符号对于双精度和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不能?
1个回答

1
在您的第一个块中,类型隐式转换为 double,因此乘法有效,但是在第二个块中没有乘法运算符。如果您在第二个类中添加以下代码,则错误将消失。
    public static ComplexWrapper operator *(ComplexWrapper a, ComplexWrapper b)
    {
        var complex = a.Payload * b.Payload;
        return complex;
    }

编辑:优化答案/第二种方法

编译器似乎将该类型提升为ComplexWrapper,这就是导致错误的原因。

只需将this强制转换为Complex,错误也会消失:

    public ComplexWrapper Times(ComplexWrapper multiplyByMe)
    {
        ComplexWrapper r = (Complex)this * multiplyByMe;
        // ERROR: Operator '*' cannot be applied to operands of type Whatever.ComplexWrapper and Whatever.ComplexWrapper.
        return r;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接