【问题标题】:Nullable<T>: and overloaded operators, bool? & boolNullable<T>:和重载的运算符,布尔? & 布尔值
【发布时间】:2010-09-23 02:57:11
【问题描述】:
  1. 为什么为 bool 定义了运算符 '&'?而运算符 '&&' 没有?
  2. 这 1) 究竟是如何布尔运算的? & 布尔? 2)布尔?和布尔工作?

Nullable 上还有其他“有趣”的运算符语义吗?泛型 T 的任何重载运算符?

【问题讨论】:

    标签: c# nullable


    【解决方案1】:

    Nullable&lt;T&gt; 上的操作员是“提升”操作员。这意味着:如果 T 有操作符,T?将有“提升”的对应物。

    && 和 ||不是真正意义上的运算符 & 和 | - 例如,它们不能被重载 - 来自 ECMA 规范 14.2.2 运算符重载:

    可重载的二元运算符有: + - * / % & | ^ > == != > =

    同样,从 ECMA 规范 14.2.7 提升的运算符中,提升的运算符是:

    对于一元运算符 + ++ - -- ! ~

    对于二元运算符 + - * / % & | ^ >

    对于等式运算符 == !=

    对于关系运算符 =

    所以基本上,短路操作符没有被定义为提升操作符。

    [编辑:添加婴儿床单]

    • 提升的运算符:编译器在 Nullable&lt;T&gt; 上提供的运算符,基于 T 的运算符 - 例如:int“+”运算符被“提升”到 int?,定义为:

      (int?x, int?y) => (x.HasValue && y.HasValue) ? (x.Value + y.Value) : (int?) null;

    • 运算符重载:为给定类型提供自定义运算符实现的行为;例如decimalDateTime 提供各种运算符重载

    • 短路:&amp;&amp;|| 的正常行为(在许多语言中,包括 C++ 和 C#) - 即第二个操作数可能不会被计算 - 即

      (表达式1, 表达式2) => 表达式1() ?表达式2() : false;

    或者也许是一个更简单的例子:

    bool someFlag = Method1() && Method2();
    

    如果 Method1() 返回 false,则不执行 Method2()(因为编译器已经知道总体答案为 false)。如果Method2() 有副作用,这一点很重要,因为保存到数据库...

    【讨论】:

    • 谢谢。然而,在 C++ 之后,所有这些术语......短路,提升......不可能覆盖 &&......对我来说听起来很奇怪 :)
    【解决方案2】:

    没有为bool? 定义短路运算符(&& ||)

    只有逻辑 AND(包括 OR)运算符,它们的行为如下:

    x        y      x & y   x | y   
    true    true    true    true
    true    false   false   true
    true    null    null    true
    false   true    false   true
    false   false   false   false
    false   null    false   null
    null    true    null    true
    null    false   false   null
    null    null    null    null
    

    【讨论】:

    【解决方案3】:

    -- 此外,逻辑 && 运算符以及 ||运算符不能重载。

    2) 位运算符起作用的原因是因为它对单个位进行运算,即简单的 1 或 0。这就是布尔运算符的本质,真假,1 和 0。

    【讨论】:

      【解决方案4】:

      运算符“&”是位运算符,而“&&”是逻辑运算符。 逻辑“AND”运算符不能应用于三态值,仅适用于二态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-08
        • 2011-09-27
        • 2011-03-27
        • 2013-03-02
        • 2012-09-20
        相关资源
        最近更新 更多