vb.net - 为什么不允许使用+ =运算符ULong(UInt64)?

时间:2014-08-30 21:27:31

标签: .net vb.net

为什么我可以在创建时分配ULong文字值

Dim myULong As ULong = 0

但是如果选项严格,我不能像下面那样增加?

myULong += 1

Visual Studio 2013告诉我

Option Strict On disallows implicit conversions from 'Decimal' to 'ULong'.

我不知道VS如何在该行代码中产生小数......

感谢您的投入!

1 个答案:

答案 0 :(得分:8)

如果两个操作数具有不同的数据类型,则算术表达式的结果将是更精确的数据类型。

由于UInt64.MaxValue大于Int32.MaxValueUInt64值增加Int32会产生Decimal(请参阅:Widening and Narrowing Conversions)而不是Int32UInt64相比,其范围太小。结果也可能是负面的,因此UInt64也不是一个好的选择。实际上,没有从UInt64到任何其他整数类型的隐式转换,甚至没有Int64Long),因为它的范围较小。

如果您尝试将结果重新分配给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