运营商评估期间的C#动态铸造

时间:2012-02-27 22:25:51

标签: c#

我目前有一个用户定义的类型

class MyType {
    double x;
    double y;
    double z;

    //This class has operator overloading implemented
    public static MyType operator + (double a,MyType b){
        ...
    }
}

稍后我会有一个数组(object []),其中一些是double和一些MyType。我想对它们进行评估,但编译器不允许将运算符'+'应用于类型对象和对象。我该怎么办?

3 个答案:

答案 0 :(得分:2)

老实说,我会创建一个MyType构造函数,它使用一个double参数,并使用它将每个double转换为MyType,这样你就可以使用MyType[](或List<MyType>)。

我知道这不是你要求的,但是你仍然能够处理MyType创建,这样添加才能正常运行,并且你的数组更加类型安全

答案 1 :(得分:2)

在代码中解析+时,编译器需要将其绑定到特定操作。类型object没有+操作,编译器不知道底层类型是doubleMyType,因此编译器出错。

为了解决此问题,您需要

  • 将元素静态转换为doubleMyType,以便编译器可以正确绑定+运算符
  • 使用dynamic并依赖运行时绑定到正确的operator+

以下是后一种方法的示例。

class MyType {
    double _value;

    internal MyType(double value) {
        _value = value;
    }

    public static MyType operator +(double left, MyType right) {
        return new MyType(left + right._value);
    }

    public static MyType operator +(MyType left, double right) {
        return new MyType(left._value + right);
    }

    public static MyType operator +(MyType left, MyType right) {
        return new MyType(left._value + right._value);
    }

    public static implicit operator MyType(double other) {
        return new MyType(other);
    }
}

class Program
{
    static void Main(string[] args) {
        object[] them = new object[] {
            42,
            new MyType(13),
            12,
            new MyType(12)
        };

        dynamic all = them;
        MyType sum = 0;
        foreach (dynamic element in all) {
            sum += element;
        }

        Console.WriteLine(sum);
    }
}

答案 2 :(得分:0)

您应该更具体地说明您的类型 - 您无法添加的原因是因为对象可能在系统中任意。

是否有任何方法可以更改特定类型的对象?

如果绝对必须是对象,那么你必须在运行时使用强制转换或as运算符或类似的机制进行评估。

例如

    public static MyType operator +(object o, MyType b)
    {
        MyOtherType mot = o as MyOtherType;
        if(o!=null)
            ...

但毫无疑问,您的解决方案会引发有关您的设计选择的问题