支持转换为布尔值但仍使用ToString显示WriteLine

时间:2012-12-29 09:12:54

标签: c#

当我运行这段代码时,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时,它会被转换为Boolean,而不是使用ToString进行打印。

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


更新

此问题的灵感来自SymbolicC++中的Equation课程。下面的代码说明Equation可以通过cout显示,也可以用于if的测试:

auto eq = x == y;

cout << eq << endl;

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

所以这在C ++中是可行的。

3 个答案:

答案 0 :(得分:12)

据我所知,你不能。您可以 提供转换为字符串...但这会使WriteLine(string)WriteLine( bool`之间的调用不明确。

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

(我也会改变你的支撑方式,但这是另一回事。)

答案 1 :(得分: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());

答案 2 :(得分:7)

您无法通过bool转化执行此操作,但可以为true的{​​{1}}和false运算符重载。当然,Equation不能隐式转换为Equation,但您仍然可以在boolifwhile和{{1}中使用它语句和条件表达式(即do运算符)。

for

从你的例子:

?: