Nullable <t>:和重载运算符,bool? &安培;布尔</T>

时间:2008-11-19 20:08:02

标签: c# nullable

  1. 为什么是运营商'&amp;'为bool?和operator'&amp;&amp;'定义不是?
  2. 这究竟是怎么回事? &安培;布尔?和2)布尔?和布尔工作?
  3. Nullable上还有其他“有趣”的运算符语义吗?通用T的任何重载运算符?

4 个答案:

答案 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;

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

  • 短路:&&||的正常行为(在许多语言中,包括C ++和C#) - 即第二个操作数可能无法被评估 - 即

    (expression1,expression2)=&gt; expression1()? expression2():false;

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

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

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

答案 1 :(得分:4)

没有为bool?

定义的短路运算符(&amp;&amp; ||)

只有逻辑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。