为什么我写
char ch = 0;
Run Code Online (Sandbox Code Playgroud)
我得到编译器错误,而不是我想要的
bool allZero = "000".All(ch => ch == 0);
Run Code Online (Sandbox Code Playgroud)
我没有得到任何错误.C#是强类型的,在这种情况下我更愿意发出警告.
那是我软件中的一个错误.
这在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;在没有允许的.