-1U 和 -1UL 的奇怪行为
Weird behavior of -1U and -1UL
我目前正在为方法创建单元测试。
应该测试的转换方法基本上由 return if value > 0
组成,所以我也有检查无符号溢出的想法。
在为测试创建测试用例时,我偶然发现了 U
和 UL
后缀的这种非常奇特的行为。
[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
}
为什么他们会这样?它不应该溢出到 uint
和 ulong
的最大值吗?
我找不到任何答案。参考源似乎只包含包装器对象 UInt32
并且不包含任何运算符。
注意:我知道这样做一开始就没有实际意义。我只是发现这种行为非常出乎意料。
它似乎正在将 uint 转换为 long,以便始终有足够的位来存储生成的正值和负值的整个潜在范围。 - 运算符不能应用于 ulong,因为没有更大的类型可以将其转换为
我目前正在为方法创建单元测试。
应该测试的转换方法基本上由 return if value > 0
组成,所以我也有检查无符号溢出的想法。
在为测试创建测试用例时,我偶然发现了 U
和 UL
后缀的这种非常奇特的行为。
[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
}
为什么他们会这样?它不应该溢出到 uint
和 ulong
的最大值吗?
我找不到任何答案。参考源似乎只包含包装器对象 UInt32
并且不包含任何运算符。
注意:我知道这样做一开始就没有实际意义。我只是发现这种行为非常出乎意料。
它似乎正在将 uint 转换为 long,以便始终有足够的位来存储生成的正值和负值的整个潜在范围。 - 运算符不能应用于 ulong,因为没有更大的类型可以将其转换为