7
  1. 为什么为 bool 定义了运算符 '&'?,而运算符 '&&' 不是?
  2. 这 1) 究竟是如何布尔的?& 布尔?2)布尔?和布尔工作?

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

4

4 回答 4

14

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

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

可重载的二元运算符有: + - * / % & | ^ << >> == != > < >= <= 只有上面列出的运算符可以重载。特别是,不能重载成员访问、方法调用或 =、&&、||、??、?:、checked、unchecked、new、typeof、as 和 is 运算符。

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

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

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

对于等式运算符 == !=

对于关系运算符 < > <= >=

所以基本上,短路运算符不被定义为提升运算符。

[编辑:添加婴儿床单]

  • 提升运算符:编译器提供的运算符 on Nullable<T>,基于 T 的运算符 - 例如:int“+”运算符被“提升”到int?,定义为:

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

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

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

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

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

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

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

于 2008-11-19T20:57:05.867 回答
4

没有为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
于 2008-11-19T20:21:47.640 回答
1

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

于 2008-11-19T20:11:21.373 回答
0

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

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

于 2008-11-19T20:21:36.733 回答