Nullable <T>:和重载运算符,bool?&bool

Pau*_*tin 6 c# nullable

  1. 为什么运算符'&'为bool定义?,运算符'&&'不是?
  2. 这个怎么样?)bool?&bool?和2)布尔?和布尔工作?

Nullable上任何其他"有趣"的运算符语义?通用T的任何重载运算符?

Mar*_*ell 13

运营商Nullable<T>是"解除"运营商.这意味着:如果T有运算符,T?将拥有"解除"对手.

&&和|| 并不是真正与&和|相同的运算符 - 例如,它们不能超载 - 来自ECMA规范14.2.2运算符重载:

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

同样,根据ECMA规范,14.2.7提升运营商,提升的运营商是:

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

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

对于相等运算符==!=

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

基本上,短路运营商并未被定义为提升运营商.

[编辑:添加婴儿床单]

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

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

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

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

    (expression1,expression2)=> expression1()?expression2():false;

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

bool someFlag = Method1() && Method2();
Run Code Online (Sandbox Code Playgroud)

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