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在 an 上使用时Equation,它会转换为 aBoolean而不是使用打印ToString

如何允许隐式转换Boolean并仍然使用WriteLine显示ToString


更新

这个问题的灵感来自SymbolicC++Equation中的类。下面的代码说明了 an可以通过显示以及在 an 的测试中使用: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)和bool 之间WriteLine(产生歧义)。

我个人强烈建议您放弃隐式转换为Boolean. 隐式转换几乎总是一个坏主意。它们使代码更加混乱,并导致您发现的意外重载更改。

(我也会改变你的支撑风格,但那是另一回事。)

于 2012-12-29T09:17:13.727 回答
8

这是因为 Console.WriteLine(bool) 重载被调用而不是 Console.WriteLine(object)。您可以显式转换为对象,并且将调用所需的重载:

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你可以为. 当然不会再隐式转换为,但您仍然可以在、、和语句和条件表达式(即运算符)中使用它。truefalseEquationEquationboolifwhiledofor?:

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 回答