为什么我可以在创建时分配ULong文字值
Dim myULong As ULong = 0
但是如果选项严格,我不能像下面那样增加?
myULong += 1
Visual Studio 2013告诉我
Option Strict On disallows implicit conversions from 'Decimal' to 'ULong'.
我不知道VS如何在该行代码中产生小数......
感谢您的投入!
答案 0 :(得分:8)
如果两个操作数具有不同的数据类型,则算术表达式的结果将是更精确的数据类型。
由于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导致编译器错误 上。例如,如果您尝试将Integer变量添加到Double 变量并将值赋给Integer变量,即编译器错误 结果,因为Double变量不能隐式转换为 输入整数。
顺便说一下,C#会自动使用正确的类型,因此编译:
UInt64 myULong = 1;
myULong += 1; // here 1 is treated as UInt64
而这不会编译
myULong += -1; // -1 is Int32