1

一部を 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 {
}

正しい順序は次のとおりです: 暗黙的にシンボル->基本->ex、次に数値->基本->exをキャストし、次にex演算子+(ex,ex)関数を使用します。

暗黙のキャスト関数と演算子関数のルックアップはどの順序で行われますか? これを回避する方法はありますか?

4

2 に答える 2

2

問題は、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.
}

このコードは、パラメーターの少なくとも 1 つを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
    }
}
于 2010-10-23T12:13:22.583 に答える
1

最初のオペランドを「ex」にキャストします。+ 演算子の最初のオペランドは、暗黙的にキャストされません。明示的なキャストを使用する必要があります。

+ 演算子は、実際には最初のオペランドからその型を決定します。これは、あなたの場合はシンボルです。最初のオペランドが ex の場合、ex+ex は 2 番目のオペランドの暗黙のキャストを試みます。

于 2010-10-23T11:30:35.693 に答える