【问题标题】:* operator and type converters* 运算符和类型转换器
【发布时间】: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


    【解决方案1】:

    在您的块 1 上,类型被隐式转换为 double,因此乘法有效,但在您的块 2 上没有乘法运算符。

    如果您在第二堂课上添加以下代码,错误将消失。

        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;
        }
    

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多