5

このコードを実行するEquation(10, 20)と、コンソールに次のように出力されます。

public class Equation
{
    public int a;
    public int b;

    public override string ToString()
    { return "Equation(" + a + ", " + b + ")"; }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(new Equation() { a = 10, b = 20 });

        Console.ReadLine();
    }
}

Equationのテストで使用されているインスタンスをサポートしたいifので、への暗黙的な変換を許可しましたBoolean:

public class Equation
{
    public int a;
    public int b;

    public override string ToString()
    { return "Equation(" + a + ", " + b + ")"; }

    public static implicit operator Boolean(Equation eq)
    { return eq.a == eq.b; }
}

class Program
{
    static void Main(string[] args)
    {
        if (new Equation() { a = 10, b = 10 })
            Console.WriteLine("equal");

        Console.WriteLine(new Equation() { a = 10, b = 20 });

        Console.ReadLine();
    }
}

ただし、問題は、 で使用すると、 を使用WriteLineして印刷する代わりに にEquation変換されることです。BooleanToString

への暗黙的な変換を許可しBoolean、引き続き をWriteLine使用して表示するにはどうすればよいToStringですか?


アップデート

この質問は、 SymbolicC++Equationのクラスに触発されています。以下のコードは、を介して表示したり、 のテストで使用したりできることを示しています。Equationcoutif

auto eq = x == y;

cout << eq << endl;

if (eq)
    cout << "equal" << endl;
else
    cout << "not equal" << endl;

したがって、これはC++で何とか可能です。

4

3 に答える 3

12

私が知る限り、あなたはできません。文字列への変換を提供することできます...しかし、それでは呼び出しがWriteLine(string)WriteLine(bool`の間であいまいになります)。

個人的には、への暗黙的な変換をやめることを強くBooleanお勧めします。暗黙の変換は、ほとんど常に悪い考えです。それらはコードをはるかに混乱させるだけでなく、あなたが見つけたように意図しない過負荷の変更につながります.

(ブレーシングのスタイルも変更しますが、それは別の問題です.)

于 2012-12-29T09:17:13.727 に答える
8

これは、Console.WriteLine(object) の代わりに Console.WriteLine(bool) オーバーロードが呼び出されるためです。オブジェクトに明示的にキャストすると、必要なオーバーロードが呼び出されます。

Console.WriteLine((object)(new Equation() { a = 10, b = 20 }));

または、明示的に .ToString() を呼び出します。

Console.WriteLine((new Equation() { a = 10, b = 20 }).ToString());
于 2012-12-29T09:20:35.493 に答える
8

bool変換ではできませんが、trueとのfalse演算子をオーバーロードできますEquation。もちろん、これ以上Equation暗黙的に変換することはできませんが、 、、、およびステートメントと条件式 (つまり、演算子)boolで引き続き使用できます。ifwhiledofor?:

public class Equation
{
    public int a;
    public int b;

    public override string ToString()
    { return "Equation(" + a + ", " + b + ")"; }

    public static bool operator true(Equation eq)
    {
        return eq.a == eq.b;
    }

    public static bool operator false(Equation eq)
    {
        return eq.a != eq.b;
    }       
}

あなたの例から:

if (new Equation() { a = 10, b = 10 })
    Console.WriteLine("equal"); // prints "equal"

Console.WriteLine(new Equation() { a = 10, b = 20 }); // prints Equation(10, 20)
于 2012-12-29T09:22:12.517 に答える