【发布时间】:2010-09-23 02:57:11
【问题描述】:
- 为什么为 bool 定义了运算符 '&'?而运算符 '&&' 没有?
- 这 1) 究竟是如何布尔运算的? & 布尔? 2)布尔?和布尔工作?
Nullable 上还有其他“有趣”的运算符语义吗?泛型 T 的任何重载运算符?
【问题讨论】:
Nullable 上还有其他“有趣”的运算符语义吗?泛型 T 的任何重载运算符?
【问题讨论】:
Nullable<T> 上的操作员是“提升”操作员。这意味着:如果 T 有操作符,T?将有“提升”的对应物。
&& 和 ||不是真正意义上的运算符 & 和 | - 例如,它们不能被重载 - 来自 ECMA 规范 14.2.2 运算符重载:
可重载的二元运算符有: + - * / % & | ^ > == != > =
同样,从 ECMA 规范 14.2.7 提升的运算符中,提升的运算符是:
对于一元运算符 + ++ - -- ! ~
对于二元运算符 + - * / % & | ^ >
对于等式运算符 == !=
对于关系运算符 =
所以基本上,短路操作符没有被定义为提升操作符。
[编辑:添加婴儿床单]
提升的运算符:编译器在 Nullable<T> 上提供的运算符,基于 T 的运算符 - 例如:int“+”运算符被“提升”到 int?,定义为:
(int?x, int?y) => (x.HasValue && y.HasValue) ? (x.Value + y.Value) : (int?) null;
运算符重载:为给定类型提供自定义运算符实现的行为;例如decimal 和DateTime 提供各种运算符重载
短路:&& 和 || 的正常行为(在许多语言中,包括 C++ 和 C#) - 即第二个操作数可能不会被计算 - 即
(表达式1, 表达式2) => 表达式1() ?表达式2() : false;
或者也许是一个更简单的例子:
bool someFlag = Method1() && Method2();
如果 Method1() 返回 false,则不执行 Method2()(因为编译器已经知道总体答案为 false)。如果Method2() 有副作用,这一点很重要,因为保存到数据库...
【讨论】:
没有为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
【讨论】:
-- 此外,逻辑 && 运算符以及 ||运算符不能重载。
2) 位运算符起作用的原因是因为它对单个位进行运算,即简单的 1 或 0。这就是布尔运算符的本质,真假,1 和 0。
【讨论】:
运算符“&”是位运算符,而“&&”是逻辑运算符。 逻辑“AND”运算符不能应用于三态值,仅适用于二态。
【讨论】: