2014-08-30 11 views
10

Come mai posso assegnare un ULONG un valore letterale alla creazionevb.net - Perché operatore + = non consentito per ULONG (UInt64)?

Dim myULong As ULong = 0 

ma con l'opzione rigoroso su, non posso incrementare come qui di seguito?

myULong += 1 

Visual Studio 2013 mi sta dicendo

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

Non ho idea di come VS fa fuori un decimale in quella riga di codice ...

Grazie per il vostro contributo!

+5

Storia, Visual Basic ha un sacco di esso . Dovrai usare '1UL' qui. –

+1

dovresti usare i letterali per rappresentare il tipo di dati corretto, 1UL, lo faccio sempre in ogni operazione matematica o dichiarazione di variabile anche per interi, i letterali numerici sono una pratica codifica personalizzata. – ElektroStudios

+2

E ancora una volta "Option Strict On" ha salvato il giorno. –

risposta

8

Se due operandi sono di diversi tipi di dati, il risultato di un'espressione aritmetica sarà del tipo di dati che è più preciso.

Da UInt64.MaxValue è maggiore Int32.MaxValue aggiungendo UInt64 valore a un valore Int32 produce un Decimal (vedi: Widening and Narrowing Conversions) non un Int32 quale intervallo è troppo piccolo rispetto al UInt64. Il risultato potrebbe anche essere negativo, quindi UInt64 non è una buona alternativa. In realtà non c'è conversione implicita da UInt64 a qualsiasi altro tipo integrale, nemmeno Int64 (Long) essendo di intervallo è più piccolo.

Ecco perché si ottiene l'errore del compilatore se si tenta di riassegnare il risultato al UInt64 vaue.

hai per lanciarla:

myULong = CULng(myULong + 1) 

o (meglio) utilizzare 1UL, in primo luogo:

myULong += 1UL 

MSDN:

conversioni di tipo-non sicuro, causa un errore del compilatore con Option Strict On. Ad esempio, se si tenta di aggiungere una variabile Integer a una variabile Double e assegnare il valore a una variabile Integer, un errore del compilatore , poiché una variabile Double non può essere convertita implicitamente in tipo Integer.

A proposito, C# utilizzerà automaticamente il tipo corretto, quindi questo compila:

UInt64 myULong = 1; 
myULong += 1; // here 1 is treated as UInt64 

mentre questo non verrà compilato

myULong += -1; // -1 is Int32 
+0

Perché non UInt64 + [U] Int32 -> [U] Int64? – user2864740

+2

'myULong + = 1UL' non funziona? (Non ho molta familiarità con VB, .NET o VS) – nhgrif

+1

@ user2864740 Perché un Int32 potrebbe essere un numero negativo.Considerare alcuni UInt64 inferiori a Abs (Int32.Min) positivi aggiunti a Int32.Min. Il risultato sarebbe un numero negativo. – nhgrif

Problemi correlati