2014-08-30 102 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

相關問題