当前位置:  开发笔记 > 编程语言 > 正文

什么是C#中的错误操作符?

如何解决《什么是C#中的错误操作符?》经验,为你挑选了4个好方法。

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#中的错误运算符是什么?

注:更多的例子可以发现在这里,这里和这里.



1> Nir..:

您可以使用它来覆盖&&||运算符.

&&||运营商不能被覆盖,但如果重写|,&,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;
}

这显然是副作用,而不是它的预期使用方式,但它很有用.



2> Jakub Šturc..:

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计算的值调用所选运算符&以生成操作的结果.



3> Will Dean..:

您链接到http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx的页面 说明了它们的用途,这是一种在引入可空值类型之前处理可空的bool的方法.

我猜他们现在对ArrayList这样的东西很有用 - 也就是说什么都没有.



4> Shog9..:

AFAIK,它将用于测试中的错误,例如当&&操作员进场时.请记住,&&短路,所以在表达式中

if ( mFalse && mTrue) 
{
   // ... something
}

mFalse.false()被调用,并且在返回时true,表达式被简化为对'mFalse.true()'的调用(然后应该返回false,否则事情会变得奇怪).

请注意,您必须实现&运算符才能编译该表达式,因为它在mFalse.false()返回时使用false.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有