1)如果一个操作数是类型ulong,而另一个操作数是类型sbyte/short/int/long,则发生编译时错误.我没有看到这个逻辑.因此,为什么两个操作数都被提升为类型double或者float?
long L = 100;
ulong UL = 1000;
double d = L + UL; // error saying + operator can't be applied
to operands of type ulong and long
Run Code Online (Sandbox Code Playgroud)
b)编译器隐式地将int文字转换为byte类型并将结果值分配给b:
byte b = 1;
Run Code Online (Sandbox Code Playgroud)
但是,如果我们尝试分配一个文本类型的ulong输入long(或类型int,byte等等),那么编译器会报告错误:
long L = 1000UL;
Run Code Online (Sandbox Code Playgroud)
我认为编译器能够弄清楚常量表达式的结果是否适合类型的变量long?!
谢谢
要回答标记为(1)的问题 - 添加有符号和无符号长度可能是一个错误.如果开发人员的意图是在这种情况下溢出到不精确的算术,那么他们应该通过将两个参数都转换为double来明确地做.隐含地这样做是为了更多地隐藏错误而不是做正确的事情.
回答标记为(b)的问题 - 当然编译器可以解决这个问题.显然它可以因为它对整数文字这样做.但同样,这几乎肯定是一个错误.如果你的意图是签名长,那你为什么把它标记为未签名?这看起来像是一个错误.C#经过精心设计,因此它会寻找像这样的奇怪模式并引起你的注意,而不是猜测你是想说出这个奇怪的东西并且在前方炽热,好像一切正常.编译器试图鼓励你编写合理的代码; 敏感代码不会混合有符号和无符号类型.