-1U 和 -1UL 的奇怪行为

Weird behavior of -1U and -1UL

我目前正在为方法创建单元测试。

应该测试的转换方法基本上由 return if value > 0 组成,所以我也有检查无符号溢出的想法。

在为测试创建测试用例时,我偶然发现了 UUL 后缀的这种非常奇特的行为。

[DataTestMethod]
// more data rows
[DataRow(-1U, true)] // Technically compiles, but not to what I expected or "wanted"
[DataRow(-1UL, true)] // "CS0023: Operator '-' cannot be applied to operand of type 'ulong'"
// more data rows
public void TestConvertToBool(object value, bool result)
{
    // For testing purposes
    ulong uLong = -1UL; // "CS0023: Operator '-' cannot be applied to operand of type 'ulong'"
    uint uInt = -1U; // "CS0266: Cannot implicitly convert type 'long' to 'uint'. An explicit conversion exists (are you missing a cast?) - Cannot convert source type 'long' to target type 'uint'"
    var foo = -1U; // foo is of type 'long'
    var bar = 1U; // bar is of type 'uint'

    // ... do the actual assertion here
}

为什么他们会这样?它不应该溢出到 uintulong 的最大值吗?

我找不到任何答案。参考源似乎只包含包装器对象 UInt32 并且不包含任何运算符。

注意:我知道这样做一开始就没有实际意义。我只是发现这种行为非常出乎意料。

它似乎正在将 uint 转换为 long,以便始终有足够的位来存储生成的正值和负值的整个潜在范围。 - 运算符不能应用于 ulong,因为没有更大的类型可以将其转换为