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; } }
所以我可以编写以下代码:
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)
但是,对于上面的所有示例,仅执行true运算符.那么C#中的错误运算符是什么?
注:更多的例子可以发现在这里,这里和这里.
您可以使用它来覆盖&&
和||
运算符.
在&&
与||
运营商不能被覆盖,但如果重写|
,&
,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; }
这显然是副作用,而不是它的预期使用方式,但它很有用.
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计算的值调用所选运算符&以生成操作的结果.
您链接到http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx的页面 说明了它们的用途,这是一种在引入可空值类型之前处理可空的bool的方法.
我猜他们现在对ArrayList这样的东西很有用 - 也就是说什么都没有.
AFAIK,它将用于测试中的错误,例如当&&
操作员进场时.请记住,&&短路,所以在表达式中
if ( mFalse && mTrue) { // ... something }
mFalse.false()
被调用,并且在返回时true
,表达式被简化为对'mFalse.true()'的调用(然后应该返回false
,否则事情会变得奇怪).
请注意,您必须实现&
运算符才能编译该表达式,因为它在mFalse.false()
返回时使用false
.