C# 运算符重载真与假是如何工作的?

C# 运算符重载真与假是如何工作的?,c#,operator-overloading,C#,Operator Overloading,你们可以重载运算符true和false,我看了一些例子,发现了这个 我完全不明白它们是怎么工作的。我知道如果我写if(obj),true返回true,那么if就会被执行。什么样的虚假回报无关紧要。然而,虚假如何起作用?在该文档中,建议&&运算符使用它。我写了下面的代码。我不知道如何获取和编译也给了我一个编译错误。我怎么会被打错电话?我怎样才能让&和| |工作呢 var ts= new MyTimeSpan();// ts += ts; if (ts){ Conso

你们可以重载运算符true和false,我看了一些例子,发现了这个

我完全不明白它们是怎么工作的。我知道如果我写if(obj),true返回true,那么if就会被执行。什么样的虚假回报无关紧要。然而,虚假如何起作用?在该文档中,建议&&运算符使用它。我写了下面的代码。我不知道如何获取和编译也给了我一个编译错误。我怎么会被打错电话?我怎样才能让&和| |工作呢

        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; }
    }

短路运算符的定义属性是,如果左侧已确定结果,则不需要计算右侧。对于
,如果左侧为
,则结果在任何情况下都为真,无需计算右侧。对于
而言,除了左侧为
false
时,结果将为false之外,其他内容都是相同的

您需要同时重载
|
true
,才能获得
|
。和
&
false
以获取
&

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

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


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

您需要重写&&和|或| |的&operator

类似这样的事情:(只是一个伪代码)


重载
true
false
运算符时,它们不仅返回
true
false
,还用于确定您类型的值被视为true还是false

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

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

由于运算符彼此相反,编译器不需要同时使用这两个运算符来确定值是真还是假。如果编写
If(obj)
编译器将使用
true
运算符来确定该值是否为真。

您想做什么?timespan为真或假意味着什么?@Mark:我在上一个问题/示例中与+运算符混在一起,这导致我使用了相同的类。这个名字是假的,我只是在学习ops是如何工作的。你还没有为&或|声明运算符-查看你提供的文档链接,它说明你需要声明这些运算符,它们需要返回MyTimeSpan对象,你需要声明运算符的true和false。文档还解释了在何处使用true和false运算符。@James:出于某种原因,我一直在想&&好像左侧和右侧都是true,但没有看到逻辑and与它的关系。现在我看到它在两次行动之间做了一个and,并检查它是否正确。这对我来说很奇怪。原因1和2是非法的,在C和C++中是真实的,因为没有逻辑和应用这使我感到非常困惑。我当时在想&好像左边和右边都是真的,没有看到逻辑和是如何关联的。现在我看到它在两个值之间进行AND运算,并检查它是否为真。这对我来说很奇怪。原因1和2是非法的,在C和C++中是真实的,因为没有逻辑和应用(1和2=0==false,在这个C代码中它说的是真的)CODEPAD.O.9ICIQZQ2,你不需要回答这个问题,但是我把我的评论变成了一个问题。也许这把你弄糊涂了。另请看我在我的问题中留下的评论或这个答案上几乎相同的评论你不需要回答这个问题,但我把我的评论变成了一个问题,如果X是一个任意类型,它覆盖了那些运算符,但是你对它一无所知,那么有没有办法确定X是否为“假”(而不是仅仅是不为“真”)?@supercat:我不确定。我尝试了一些不同的方法来测试它,但是我还没有找到一种方法来使用
false
操作符而不重载
&
操作符。@Guffa:如果
使用
true
操作符,而不是尝试对
bool
进行隐式转换,或者使用专门用于
true
false
的语法,那就太糟糕了运算符[例如,
if true(threeStateCOnditional){codeIfTrue}else if false{codeIfFalse}else{codeiffnorth}
]类型支持短路运算符的事实并不一定意味着它应该直接用作条件。
public static bool operator true(MyTimeSpan t) { return t.Value != 0; }
public static bool operator false(MyTimeSpan t) { return t.Value == 0; }