C#铸造问题

时间:2017-11-02 09:36:12

标签: c# linq casting

为什么我写

char ch = 0;

我得到编译器错误,而不是

bool allZero = "000".All(ch => ch == 0);

我没有收到任何错误。 C#是强类型的,在这种情况下我更愿意发出警告。

这是我软件中的一个错误。

1 个答案:

答案 0 :(得分:7)

这在C#语言规范中有解释。

6.1.2隐式数字转换 状态:

  

隐式数字转换为:

     

(...某些文字省略)

     

•从char到ushort,int,uint,long,ulong,float,double或decimal。

继续明确陈述:

  

char类型没有隐式转换,因此其他整数类型的值不会自动转换为char类型

7.3.6.2二进制数字促销 状态:

  

对于预定义的+, - ,*,/,%,&,|,^, == ,!=,>,<,>的操作数进行二进制数字提升; =,和< =二元运算符。二进制数字提升隐式地将两个操作数转换为公共类型,在非关系运算符的情况下,它也成为操作的结果类型。二进制数字促销包括按照它们在此处显示的顺序应用以下规则:

     

•如果任一操作数的类型为十进制,则另一个操作数将转换为十进制类型,或者如果另一个操作数的类型为float或double,则会发生绑定时错误。

     

(...某些文字省略)

     

•否则,两个操作数都将转换为int。

因此,当编译char == 0时,编译器会在生成比较代码之前将char提升为int。

标准中没有任何内容允许int隐式转换为char(即使它是char的有效范围内的常量值),实际上它是明确禁止的 - 这就是为什么char ch = 0; 不允许的原因。