如果两个操作数具有不同的数据类型,则算术表达式的结果将是更精确的数据类型。
由于UInt64.MaxValue
大于Int32.MaxValue
添加UInt64
值到Int32
值产生一个Decimal
(参见:Widening and Narrowing Conversions)不是Int32
哪个范围太小相比UInt64
。结果也可能是负面的,所以UInt64
也不是一个好的选择。实际上没有从UInt64
到其他任何整数类型的隐式转换,甚至没有Int64
(Long
),因为它的范围较小。
这就是为什么如果您尝试将结果重新分配给UInt64
vaue时出现编译器错误的原因。
要么你要投它:
myULong = CULng(myULong + 1)
或(更好)首先使用1UL
:
myULong += 1UL
MSDN:
类型不安全的转换,原因一个带有Option Strict的编译器错误 On。例如,如果尝试将Integer变量添加到双变量 变量并将该值赋给Integer变量,则会产生编译器错误 结果,因为Double变量不能隐式转换为 类型Integer。
顺便说一句,C#会自动使用正确的类型,所以这个编译:
UInt64 myULong = 1;
myULong += 1; // here 1 is treated as UInt64
,而这不会编译
myULong += -1; // -1 is Int32
历史,Visual Basic中有很多它。你将不得不在这里使用'1UL'。 – 2014-08-30 21:39:12
你应该使用文字来表示适当的数据类型,1UL,我总是在每一个数学运算或变量声明中做到这一点,即使对于整数,数字文字也是一种实用的自定义编码。 – ElektroStudios 2014-08-31 02:01:54
再一次'Option Strict On'节省了一天的时间。 – 2014-08-31 13:35:37