运营商Nullable
是"解除"运营商.这意味着:如果T有运算符,T?将拥有"解除"对手.
&&和|| 并不是真正与&和|相同的运算符 - 例如,它们不能超载 - 来自ECMA规范14.2.2运算符重载:
可重载的二元运算符是:+ - */%&| ^ << >> ==!=> <> = <=只有上面列出的运算符可以重载.特别是,不能重载成员访问,方法调用或=,&&,||,??,?:,checked,unchecked,new,typeof,as和is运算符.
同样,根据ECMA规范,14.2.7提升运营商,提升的运营商是:
对于一元运算符+ ++ - - !〜
对于二元运算符+ - */%&| ^ << >>
对于相等运算符==!=
对于关系运算符<> <=> =
基本上,短路运营商并未被定义为提升运营商.
[编辑:添加婴儿床单]
提升运算符:编译器提供的运算符Nullable
,基于T的运算符 - 例如:int
"+"运算符被"提升"到int?
,定义为:
(int?x,int?y)=>(x.HasValue && y.HasValue)?(x.Value + y.Value):( int?)null;
运算符重载:为给定类型提供自定义运算符实现的行为; 例如,decimal
并DateTime
提供各种操作员重载
短路:&&
和||
(在许多语言中,包括C++和C#)的正常行为- 即可能不会评估第二个操作数- 即
(expression1,expression2)=> expression1()?expression2():false;
或者也许是一个更简单的例子:
bool someFlag = Method1() && Method2();
如果Method1()
返回false,Method2()
则不执行(因为编译器已经知道整体答案是假的).如果Method2()
有副作用,这很重要,因为保存到数据库...
运营商Nullable
是"解除"运营商.这意味着:如果T有运算符,T?将拥有"解除"对手.
&&和|| 并不是真正与&和|相同的运算符 - 例如,它们不能超载 - 来自ECMA规范14.2.2运算符重载:
可重载的二元运算符是:+ - */%&| ^ << >> ==!=> <> = <=只有上面列出的运算符可以重载.特别是,不能重载成员访问,方法调用或=,&&,||,??,?:,checked,unchecked,new,typeof,as和is运算符.
同样,根据ECMA规范,14.2.7提升运营商,提升的运营商是:
对于一元运算符+ ++ - - !〜
对于二元运算符+ - */%&| ^ << >>
对于相等运算符==!=
对于关系运算符<> <=> =
基本上,短路运营商并未被定义为提升运营商.
[编辑:添加婴儿床单]
提升运算符:编译器提供的运算符Nullable
,基于T的运算符 - 例如:int
"+"运算符被"提升"到int?
,定义为:
(int?x,int?y)=>(x.HasValue && y.HasValue)?(x.Value + y.Value):( int?)null;
运算符重载:为给定类型提供自定义运算符实现的行为; 例如,decimal
并DateTime
提供各种操作员重载
短路:&&
和||
(在许多语言中,包括C++和C#)的正常行为- 即可能不会评估第二个操作数- 即
(expression1,expression2)=> expression1()?expression2():false;
或者也许是一个更简单的例子:
bool someFlag = Method1() && Method2();
如果Method1()
返回false,Method2()
则不执行(因为编译器已经知道整体答案是假的).如果Method2()
有副作用,这很重要,因为保存到数据库...