Nullable上还有其他“有趣”的运算符语义吗?通用T的任何重载运算符?
答案 0 :(得分:13)
Nullable<T>
上的运营商是“解除”运营商。这意味着:如果T有运算符,T?将拥有“解除”的对手。
&安培;&安培;和||并不是真正的运营商和&amp;和| - 例如,它们不能超载 - 来自ECMA规范14.2.2运算符重载:
可重载二元运算符是: + - * /%&amp; | ^&lt;&lt; &GT;&GT; ==!=&gt; &LT; &gt; =&lt; =只有上面列出的运算符可以 超载。特别是,事实并非如此 可能超载成员访问权限, 方法调用,或=,&amp;&amp;,||, ??,?:,check,unchecked,new, typeof,as,and是运营商。
同样,根据ECMA规范,14.2.7提升运营商,提升的运营商是:
对于一元运算符 + ++ - - ! 〜
对于二元运算符 + - * /%&amp; | ^&lt;&lt; &GT;&GT;
对于相等运算符 ==!=
对于关系运算符&lt; &GT; &lt; =&gt; =
基本上,短路运营商并未被定义为提升运营商。
[编辑:添加了婴儿床单]
解除运算符:Nullable<T>
上的编译器提供的运算符,基于T的运算符 - 例如:int
“+”运算符被“提升”到int?
,定义为:
(int?x,int?y)=&gt; (x.HasValue&amp;&amp; y.HasValue)? (x.Value + y.Value):( int?)null;
运算符重载:为给定类型提供自定义运算符实现的行为;例如decimal
和DateTime
提供各种运算符重载
短路:&&
和||
的正常行为(在许多语言中,包括C ++和C#) - 即第二个操作数可能无法被评估 - 即
(expression1,expression2)=&gt; expression1()? expression2():false;
或许是一个更简单的例子:
bool someFlag = Method1() && Method2();
如果Method1()
返回false,则不执行Method2()
(因为编译器已经知道整体答案为假)。如果Method2()
有副作用,这很重要,因为保存到数据库......
答案 1 :(得分: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
答案 2 :(得分:1)
运营商“&amp;”是按位运算符,“其中”&amp;&amp;&amp;是逻辑运算符。 logcial“AND”运算符不能用于三态值,仅适用于twostate。
答案 3 :(得分:0)
- 此外,逻辑&amp;&amp;运算符和||操作员不能超载。
2)按位运算符工作的原因是因为它对单个位进行操作,这是一个简单的1或0.这就是布尔运算符本质上是,真和假,1和0。