Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 支持转换为布尔值,但仍有使用ToString的WriteLine显示_C# - Fatal编程技术网

C# 支持转换为布尔值,但仍有使用ToString的WriteLine显示

C# 支持转换为布尔值,但仍有使用ToString的WriteLine显示,c#,C#,当我运行这段代码时,方程(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) { Conso

当我运行这段代码时,
方程(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();
    }
}
我想支持在测试
if
时使用的
方程
实例,因此我允许隐式转换为
布尔值

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
时,它被转换为
布尔值
,而不是使用
ToString
打印

我如何允许隐式转换到
布尔值
,并且仍然使用
ToString
显示
WriteLine


更新

这个问题的灵感来源于中的
等式
。下面的代码说明了可以通过
cout
显示
方程
,也可以在测试
if
时使用:

auto eq = x == y;

cout << eq << endl;

if (eq)
    cout << "equal" << endl;
else
    cout << "not equal" << endl;
autoeq=x==y;

就我所知,你不能。您还可以提供到字符串的转换。。。但是这会使调用在
WriteLine(string)
WriteLine(
bool`)之间产生歧义

就我个人而言,我强烈建议您放弃对
布尔值的隐式转换。隐式转换几乎总是一个坏主意。它们使代码更加混乱,并导致您发现的意外过载更改


(我还想更改支撑样式,但那是另一回事。)

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

Console.WriteLine((object)(new Equation() { a = 10, b = 20 }));
或者显式调用.ToString():


不能使用
bool
转换,但可以重载
方程的
true
false
运算符。当然,
等式
将不再隐式转换为
bool
,但您仍然可以在
if
while
do
for
语句和条件表达式(即
?:
运算符)中使用它

从你的例子来看:

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

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

哇,你搞定了,迈克。谢谢虽然
等式
在您列出的语句中起作用,但它们似乎不适用于运算符
|
&
。我想我应该为那些正在考虑这个选项的人提一下。@dharmatech,正如我说的,它不再可以转换为
布尔值。您也可以重载
&
|
运算符,但它的用途有限,因为您仍然无法执行类似
eq&&true的操作。实际上,我同意Jon的评论,即这种事情有点太聪明了,可能会让您的代码使用者和未来的维护人员感到困惑。请参阅我对Jon的评论,了解我为什么这样做。Jon,查看mike z的答案。这正是我想要的。你认为这种方法有什么缺点吗?@dharmatech:它没有回答你提出的问题,即保持对
bool
的隐式转换。就我个人而言,我也不会让
true
false
操作符过载-我会让事情更加明确。我发现,试图对这样的操作符“可爱”通常会导致代码更难维护。当然是YMMV——但我会非常小心。我同意一般的指导原则,即避免隐式转换为
布尔值。在本例中,我试图模拟CC++和GiNaC库的一个特性。它们都覆盖
==
,以便创建一个等式对象。但是,如果在测试中使用该方程,则其计算结果应为布尔值。一般来说,这是个好主意吗?在大多数情况下没有,但是这些是嵌入在C++中的计算机代数系统。出于学习目的,我想看看如何在C#中实现此功能。
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)