C#0(减号)uint =无符号结果?

mik*_*ike 4 c# operators

public void Foo(double d){
    // when called below, d == 2^32-1 
    ...
}
public void Bar(){
    uint ui = 1;
    Foo( 0 - ui );
}
Run Code Online (Sandbox Code Playgroud)

我希望0和ui都能在这里升级为签名多头.

是的,使用0字面值,在编译时可以知道转换为uint是安全的,

但我想这一切似乎都错了.至少应发出警告.

谢谢!

语言规范是否涵盖了这样的半模糊情况?

Jon*_*eet 7

为什么会升级到long什么?规范(第7.8.5节)列出了整数减法的四个运算符:

  • int operator-(int x, int y);
  • uint operator-(uint x, uint y);
  • long operator-(long x, long y);
  • ulong operator-(ulong x, ulong y);

鉴于恒定值0是隐式转换为uint,但uintui隐式转换为int,所述第二操作者根据在部分7.3.4中描述的二进制运算符重载解析步骤选择的.

(您是否有可能不知道隐式常量表达式转换0uint那个令人困惑的部分?有关详细信息,请参阅C#4规范的第6.1.9节.)

在7.3.4节(后面引用7.3.5和7.5.3)之后略有曲折,但我相信它的定义很明确,并且根本不含糊.

如果这是困扰你的溢出,那么期望也会失败吗?

int x = 10;
int y = int.MaxValue - 5;
int z = x + y;
Run Code Online (Sandbox Code Playgroud)

如果没有,这里的真正区别是什么?