c# 允许你重载一个类的 "operator true" 和 "operator false":
class Foo
{
bool Thing;
Foo(bool thing)
{
Thing = thing;
}
public static bool operator true(Foo foo) => foo.Thing;
public static bool operator false(Foo foo) => !foo.Thing;
}
它有点起作用了。你可以说
Foo foo = new Foo(true);
if (foo)
Stuff();
string s = foo ? "yes" : "no";
但是你不能这样说。
Foo foo = new Foo(true);
bool boo = true;
if (boo && foo)
Stuff();
if (boo & foo)
Stuff();
if (boo & (foo == true))
Stuff();
if (boo & ((bool)foo))
Stuff();
Foo foo2 = new Foo(true);
if (foo && foo2)
Stuff();
if (foo & foo2)
Stuff();
if (foo == boo)
Stuff();
if (foo != boo)
Stuff();
bool boo2 = foo;
在每种情况下编译器都会抱怨。
除了那些非常特定的语法外,c#编译器在任何地方都使用"operator true"和"operator false"吗?
编辑
我发现了另一个地方可以使用“operator true”和“operator false”。如果您定义了一个“operator&”,它返回Foo以及true和false运算符,则编译器将采用表达式“foo1 && foo2”并假装您编写了“foo1&foo2”,因此调用您重载的运算符。换句话说,即使从未调用那些运算符,存在"operator true"和"operator false"也会改变编译器的行为。
boo == foo
或者boo != foo
吗? - Trevorif (boo && foo)
必须将 boo 和 foo 都转换为 bool 类型,而类 Foo 没有实现所需的隐式转换。为了使其他使用位运算符的语句正常工作,您应该实现 & 和 | 运算符。 - Oguz Ozgul