当我运行这段代码时,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++中是有可能的。
最佳答案
您无法通过bool
转换来做到这一点,但可以为true
重载false
和Equation
运算符。当然Equation
将不再可以隐式转换为bool
,但是您仍然可以在if
,while
,do
和for
语句和条件表达式(即?:
运算符)中使用它。
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)