C#中的错误运算符有什么好处?

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)
    

    但是,对于上面的所有例子,只有真正的操作符被执行。 那么C#中的错误运算符有什么好处?

    注意:在这里和这里可以找到更多示例。


    您可以使用它来覆盖&&|| 运营商。

    &&|| 操作符不能被覆盖,但是如果你重写|&truefalse的编译器将以正确的方式调用|&当你写||&&

    例如,看看这个代码(来自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的页面会说明它们的用途,这是在引入可空值类型之前处理可空布尔值的一种方法。

    我猜现在他们对于ArrayList相同的东西是好的 - 也就是说什么都没有。

    链接地址: http://www.djcxy.com/p/52831.html

    上一篇: What's the false operator in C# good for?

    下一篇: What's the best way to implement a "catch all exceptions handler"