2014-08-30 41 views
10

为什么我可以在创建vb.net - 为什么+ =运算符不允许ULong(UInt64)?

Dim myULong As ULong = 0 

但选项严格的分配乌龙字面值,我不能像递增下面?

myULong += 1 

的Visual Studio 2013是告诉我

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

我不知道VS如何让出该行代码的十进制...

感谢您的输入!

+5

历史,Visual Basic中有很多它。你将不得不在这里使用'1UL'。 – 2014-08-30 21:39:12

+1

你应该使用文字来表示适当的数据类型,1UL,我总是在每一个数学运算或变量声明中做到这一点,即使对于整数,数字文字也是一种实用的自定义编码。 – ElektroStudios 2014-08-31 02:01:54

+2

再一次'Option Strict On'节省了一天的时间。 – 2014-08-31 13:35:37

回答

8

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

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

这就是为什么如果您尝试将结果重新分配给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 
+0

为什么不是UInt64 + [U] Int32 - > [U] Int64? – user2864740 2014-08-30 21:36:38

+2

'myULong + = 1UL'不行吗? (我对VB,.NET或VS不是很熟悉) – nhgrif 2014-08-30 21:36:39

+1

@ user2864740因为Int32可能是负数。考虑一些比Abs(Int32.Min)少添加到Int32.Min的正面UInt64。结果会是一些负数。 – nhgrif 2014-08-30 21:37:53

相关问题