【问题标题】:How does operator overloading of true and false work?true 和 false 的运算符重载如何工作?
【发布时间】:2011-07-09 08:29:42
【问题描述】:

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

我完全不明白它们是如何工作的。我知道如果我写 if(obj) 并且 true 返回 true 然后 if 被执行。 false 返回什么并不重要。然而,虚假是如何工作的?在该文档中,建议 && 运算符使用它。我写了下面的代码。我不知道如何让 && 编译。 ||也给了我一个编译错误。我如何得到虚假被调用?以及如何获得 && 和 ||上班?

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

【问题讨论】:

  • 你想做什么?时间跨度是真还是假是什么意思?
  • @Mark:我在上一个问题/示例中搞乱了 + 运算符,这导致了我这个问题,我使用了同一个类。这个名字是个假人,我只是在学习操作是如何工作的。
  • 您还没有为 & 或 | 声明运算符- 查看您提供的文档链接,说明您需要声明这些运算符,它们需要返回 MyTimeSpan 对象并且您需要为真假声明运算符。该文档还解释了 true 和 false 运算符的使用位置。
  • @James:出于某种原因,我在想 && 好像左右两边都是真实的,但没有看到它的逻辑和相关性。现在我看到它在两个操作之间做了一个 and 并检查它是否是真的。这对我来说很奇怪。原因 1 && 2 在 C# 中是非法的,而在 C++ 中它是正确的,因为没有应用逻辑与 codepad.org/9iCaqzQ2

标签: c# operator-overloading


【解决方案1】:

短路运算符的定义属性是,如果左侧已经确定结果,则不需要评估右侧。对于or,如果左侧是true,则结果在任何情况下都是正确的,无需评估右侧。对于and,除了左边是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 的表达式。

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

【讨论】:

  • 这让我非常困惑。我在想 && 好像左右两边都是真实的,没有看到它的逻辑和相关性。现在我看到它在两个值之间做了一个 AND 并检查它是否为真。这对我来说很奇怪。原因 1 && 2 在 C# 中是非法的,而在 C++ 中它是正确的,因为没有应用逻辑与(1&2==0==false,在这个 c 代码中它说它是真的)codepad.org/9iCaqzQ2
  • 你不需要回答这个问题,但我把我的评论变成了一个问题stackoverflow.com/questions/5203498/…
  • @acid 我的回答有很大的错误。也许这让你感到困惑。
【解决方案2】:

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

例如,如果您的类中的零值表示假,那么非零值表示真:

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 运算符来判断值是否为真。

【讨论】:

  • +1。另请参阅我在问题中留下的评论或对此答案的几乎相同的评论stackoverflow.com/questions/5203093/…
  • 你不需要回答这个问题,但我把我的评论变成了一个问题stackoverflow.com/questions/5203498/…
  • 如果 X 是某种任意类型,它覆盖了这些运算符,但人们对此一无所知,有没有办法确定 X 是否为“假”(而不是仅仅不是“真”)?
  • @supercat:我不确定。我尝试了一些不同的方法来测试它,但我还没有找到一种方法来使用 false 运算符而不重载 & 运算符。
  • @Guffa:太糟糕了if 使用true 运算符,而不是尝试隐式转换为bool 或具有专门使用truefalse 运算符的语法[例如if true (threeStateCOnditional) { codeIfTrue } else if false { codeIfFalse} else { codeIfNeither }] 类型支持短路运算符这一事实并不一定意味着它应该直接用作条件。
【解决方案3】:

您需要为 && 和 | 覆盖 & 运算符或 ||。

类似这样的东西:(只是一个虚拟代码)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 2011-02-09
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多