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