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

Flo*_*ach 10 .net vb.net

为什么我可以在创建时分配ULong一个字面值

Dim myULong As ULong = 0
Run Code Online (Sandbox Code Playgroud)

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

myULong += 1
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2013告诉我

Option Strict On disallows implicit conversions from 'Decimal' to 'ULong'.
Run Code Online (Sandbox Code Playgroud)

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

感谢您的输入!

Tim*_*ter 8

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

因为UInt64.MaxValue大于Int32.MaxValueUInt64值增加值会Int32产生a Decimal(参见:加宽和缩小转换),而不是Int32哪个范围与...相比太小UInt64.结果也可能是负面的,所以UInt64也不是一个好的选择.实际上没有隐式转换UInt64为任何其他整数类型,而不是偶数Int64(Long),因为它的范围更小.

如果您尝试将结果重新分配给UInt64vaue,那么这就是您遇到编译器错误的原因.

你要么必须施展它:

myULong = CULng(myULong + 1)
Run Code Online (Sandbox Code Playgroud)

或(更好)1UL首先使用:

myULong += 1UL
Run Code Online (Sandbox Code Playgroud)

MSDN:

类型不安全的转换,使用Option Strict On导致编译器错误.例如,如果尝试将Integer变量添加到Double变量并将值分配给Integer变量,则会产生编译器错误,因为Double变量不能隐式转换为Integer类型.

顺便说一下,C#会自动使用正确的类型,所以这个编译:

UInt64 myULong = 1;
myULong += 1;   // here 1 is treated as UInt64 
Run Code Online (Sandbox Code Playgroud)

而这不会编译

myULong += -1;  // -1 is Int32 
Run Code Online (Sandbox Code Playgroud)

  • @ user2864740:因为`Int32`可以是负数,所以`UInt64 + Int32`的结果也可以是负数.因此`UInt64`不是一个选项. (3认同)
  • `myulong + = 1UL`会不起作用?(我对VB,.NET或VS不是很熟悉) (2认同)