具有两个隐式转换的运算符函数+不起作用

时间:2010-10-23 11:00:39

标签: c# casting operator-overloading implicit-conversion ginac

我正在尝试将一些部件从ginac(www.ginac.de)移植到C#。但我遇到了这个:

class Program {

static void Main(string[] args) {

        symbol s = new symbol();          
        numeric n = new numeric();

        ex e = s + n; // "Operator + doesn't work for symbol, numeric"
    }
}

class ex {
    //this should be already be sufficient:
    public static implicit operator ex(basic b) {
        return new ex();
    }
    //but those doesn't work as well:
    public static implicit operator ex(numeric b) {
        return new ex();
    }
    public static implicit operator ex(symbol b) {
        return new ex();
    }

    public static ex operator +(ex lh, ex rh) {
        return new ex();
    }
}
class basic {      
}
class symbol : basic {
}
class numeric : basic {
}

正确的顺序应该是:隐式转换符号 - > basic-> ex,然后是numeric-> basic-> ex然后使用ex运算符+(ex,ex)函数。

查找隐式转换函数和操作符函数的顺序是什么? 有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题在于operator + 根据MSDN,如果operator +方法中的参数都不是编写方法的类类型,则编译器会抛出错误。 Link to documentation

class iii { //this is extracted from the link above.. this is not complete code.
public static int operator +(int aa, int bb) ...  // Error CS0563
// Use the following line instead:
public static int operator +(int aa, iii bb) ...  // Okay.
}

此代码将起作用,因为您要将至少一个参数转换为ex类型:

class basic { }
class symbol : basic { }
class numeric : basic { }

class ex {
    public static implicit operator ex(basic b) {
        return new ex();
    }

    public static implicit operator basic(ex e) {
        return new basic();
    }

    public static ex operator + (basic lh, ex rh) {
        return new ex();
    }
}

class Program {
    static void Main(string[] args) {
        symbol s = new symbol();
        numeric n = new numeric();

        // ex e0 = s + n; //error!
        ex e1 = (ex)s + n; //works
        ex e2 = s + (ex)n; //works
        ex e3 = (ex)s + (ex)n; //works
    }
}

答案 1 :(得分:1)

将第一个操作数转换为“ex”。 +运算符的第一个操作数不会被隐式转换。您需要使用显式强制转换。

+运算符实际上是从第一个操作数确定其类型,在您的情况下是符号。当第一个操作数是ex时,ex + ex将尝试隐式转换第二个操作数。