C# 为什么int和uint比较在一种情况下失败,而在另一种情况下却没有失败?

C# 为什么int和uint比较在一种情况下失败,而在另一种情况下却没有失败?,c#,.net,C#,.net,考虑以下计划: static void Main (string[] args) { int i; uint ui; i = -1; Console.WriteLine (i == 0xFFFFFFFF ? "Matches" : "Doesn't match"); i = -1; ui = (uint)i; Console.WriteLine (ui == 0xFFFFFFFF ? "Matches" : "Doesn't match

考虑以下计划:

static void Main (string[] args) {
    int i;
    uint ui;

    i = -1;
    Console.WriteLine (i == 0xFFFFFFFF ? "Matches" : "Doesn't match");

    i = -1;
    ui = (uint)i;
    Console.WriteLine (ui == 0xFFFFFFFF ? "Matches" : "Doesn't match");

    Console.ReadLine ();
}
上述程序的输出为:

Doesn't match
Matches

为什么在未经检查的整数-1到无符号整数的转换为0xFFFFFF时第一次比较失败?(当第二个通过时)

在第二种情况下,您将-1强制转换为uint,得到0xffffff,因此它与预期匹配。显然,在第一种情况下,比较是以两个值具有适当范围的格式进行的,允许它们不匹配的数学上正确的结果。

您的第一次比较将基于长。。。因为0xFFFFFF不是int值:)
试着写

Console.WriteLine( (long)i == 0xFFFFFFFF ? "Matches" : "Doesn't match" );

您将得到一条
强制转换是冗余的
消息

否,0xFFFFFFFF是uint值。。。试试看:
0xffffff.GetType().Name
@Thomas:好的,你说得对。重点是:它不是在int。。。编辑在i==0xFFFFFFFF上有一个编译器警告,表示“与整数值的比较是无用的;常量超出了int的范围”。那么@tanascius是怎么说的呢?当我编译这个有问题的程序时,我没有收到任何警告。我的警告级别设置为4。我错过什么了吗?(使用VS 2008、.NET 3.5)