C#铸造问题

ove*_*mer 1 c# linq casting

为什么我写

char ch = 0;
Run Code Online (Sandbox Code Playgroud)

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

bool allZero = "000".All(ch => ch == 0);
Run Code Online (Sandbox Code Playgroud)

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

那是我软件中的一个错误.

Mat*_*son 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;没有允许的.