操作员如何重载真假工作?

时间:2011-03-05 10:05:05

标签: c# operator-overloading

您可以重载运算符true和false我查看了示例并找到了此http://msdn.microsoft.com/en-us/library/aa691312%28v=vs.71%29.aspx

我完全不明白他们是如何工作的。我知道如果我写if(obj)并且true返回true则执行if。什么是错误的回报并不重要。但假工作怎么样?在该文件中,它被指出&& amp;运营商使用它。我写了下面的代码。我不知道如何得到&&编译。 ||也给了我一个编译错误。我怎么会被称为虚假?以及如何获得&&和||工作?

        var ts= new MyTimeSpan();// ts += ts;
        if (ts){ Console.WriteLine("Is true"); }
        else { Console.WriteLine("not true"); }
        //Console.WriteLine(ts && ts ? "Y" : "N");

    class MyTimeSpan
    {
        public static MyTimeSpan operator +(MyTimeSpan t, MyTimeSpan t2) { return new MyTimeSpan(); }
        public static bool operator true(MyTimeSpan t) { return true; }
        public static bool operator false(MyTimeSpan t) { return false; }
    }

3 个答案:

答案 0 :(得分:21)

短路操作符的定义属性是,如果左侧已经确定结果,则不需要评估右侧。对于or,如果左侧为true,则结果在任何情况下都为真,并且无需评估右侧。对于and它是相同的,但如果左侧是false,则结果将为false。

您需要重载|true才能获得||。并&false获取&&

a||b对应于op_true(a)?a:(a|b)之类的内容。因此,如果true运算符返回true,则不需要计算b的表达式。

a&&b对应于op_false(a)?a:(a&b)之类的内容。因此,如果false运算符返回true,则不需要计算b的表达式。

在创建自定义布尔类型时,重载短路运算符非常有用,例如可以为空的bool(参见DBBool

答案 1 :(得分:6)

当重载truefalse运算符时,它们不仅返回truefalse,它们还用于确定您的类型的值是否被视为是真还是假。

例如,如果类中的零值表示false,则非零值表示true:

public static bool operator true(MyTimeSpan t) { return t.Value != 0; }
public static bool operator false(MyTimeSpan t) { return t.Value == 0; }

由于运算符彼此相反,编译器不需要同时使用它们来确定值是true还是false。如果您编写if(obj),编译器将使用true运算符来确定该值是否为真。

答案 2 :(得分:1)

你需要覆盖&运营商&&和|或||。

这样的事情:(只是一个虚拟代码)

public static MyTimeSpan operator &(MyTimeSpan t, MyTimeSpan s) { return t; }

public static MyTimeSpan operator |(MyTimeSpan t, MyTimeSpan s) { return t; }