Оператор-функция + с двумя неявными приведениями не работает - PullRequest
1 голос
/ 23 октября 2010

Я пытаюсь перенести некоторые детали из 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 operator + (ex, ex).

В каком порядке выполняется поиск неявных функций приведения и операторных функций? Есть ли способ обойти это?

Ответы [ 2 ]

2 голосов
/ 23 октября 2010

Проблема с operator + Согласно MSDN, компилятор выдает ошибку, если ни один из параметров в методе operator + не относится к типу класса, в который записан метод. Ссылка на документацию .

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 голос
/ 23 октября 2010

Приведите первый операнд к «ex». Первый операнд оператора + не будет приведен неявно. Вам нужно использовать явное приведение.

Оператор + фактически определяет его тип по первому операнду, который в вашем случае является символом. Когда первый операнд является ex, тогда ex + ex будет пытаться выполнить неявное приведение второго операнда.

...