C#中有两个奇怪的运算符:
如果我理解这一点,这些运算符可以用于我想要使用的类型而不是布尔表达式,并且我不希望提供对bool的隐式转换.
假设我有以下课程:
public class MyType
{
public readonly int Value;
public MyType(int value)
{
Value = value;
}
public static bool operator true (MyType mt)
{
return mt.Value > 0;
}
public static bool operator false (MyType mt)
{
return mt.Value < 0;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以编写以下代码:
MyType mTrue = new MyType(100);
MyType mFalse = new MyType(-100);
MyType mDontKnow = new MyType(0);
if (mTrue)
{
// Do something.
}
while (mFalse)
{
// Do something else.
}
do
{
// Another code comes here.
} while (mDontKnow)
Run Code Online (Sandbox Code Playgroud)
但是,对于上面的所有示例,仅执行true运算符.那么C#中的错误运算符是什么?
Nir*_*Nir 65
您可以使用它来覆盖&&和||运算符.
在&&与||运营商不能被覆盖,但如果重写|,&,true和false完全正确的方式编译器会调用|和&当你写||和&&.
例如,看看这段代码(来自http://ayende.com/blog/1574/nhibernate-criteria-api-operator-overloading - 我发现了这个技巧; @BiggsTRC的归档版本):
public static AbstractCriterion operator &(AbstractCriterion lhs, AbstractCriterion rhs)
{
return new AndExpression(lhs, rhs);
}
public static AbstractCriterion operator |(AbstractCriterion lhs, AbstractCriterion rhs)
{
return new OrExpression(lhs, rhs);
}
public static bool operator false(AbstractCriterion criteria)
{
return false;
}
public static bool operator true(AbstractCriterion criteria)
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
这显然是副作用,而不是它的预期使用方式,但它很有用.
Jak*_*urc 25
Shog9和Nir:谢谢你的回答.那些答案向我指出了Steve Eichert的文章,它指向了msdn:
操作x && y被评估为T.false(x)?x:T.&(x,y),其中T.false(x)是在T中声明的运算符false的调用,并且T.&(x,y)是所选运算符&的调用.换句话说,首先计算x并在结果上调用operator false以确定x是否肯定为false.然后,如果x肯定是假的,则操作的结果是先前为x计算的值.否则,计算y,并且对先前为x计算的值和为y计算的值调用所选运算符&以生成操作的结果.
Wil*_*ean 14
您链接到http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx的页面 说明了它们的用途,这是一种在引入可空值类型之前处理可空的bool的方法.
我猜他们现在对ArrayList这样的东西很有用 - 也就是说什么都没有.
AFAIK,它将用于测试中的错误,例如当&&操作员进场时.请记住,&&短路,所以在表达式中
if ( mFalse && mTrue)
{
// ... something
}
Run Code Online (Sandbox Code Playgroud)
mFalse.false()被调用,并且在返回时true,表达式被简化为对'mFalse.true()'的调用(然后应该返回false,否则事情会变得奇怪).
请注意,您必须实现&运算符才能编译该表达式,因为它在mFalse.false()返回时使用false.