我正在尝试将一些部件从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)函数。
查找隐式转换函数和操作符函数的顺序是什么? 有没有办法解决这个问题?
答案 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将尝试隐式转换第二个操作数。