2014-08-30 9 views
10

Jak to mogę przypisać Ulong wartość literalną w tworzeniuvb.net - Dlaczego operator + = nie jest dozwolony dla ULong (UInt64)?

Dim myULong As ULong = 0 

ale z opcją na ścisłym, nie mogę zwiększyć jak poniżej?

myULong += 1 

Visual Studio 2013 mówi mi

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

nie mam pojęcia, jak się to czyni VS po przecinku w tym wierszu kodu ...

Dziękujemy za wejście!

+5

Historia, Visual Basic ma go dużo . Będziesz musiał użyć '1UL' tutaj. –

+1

powinieneś używać literałów do reprezentowania właściwego typu danych, 1UL, zawsze robię to w każdej operacji matematycznej lub deklaracji zmiennej nawet dla liczb całkowitych, literały numeryczne to praktyczne kodowanie niestandardowe. – ElektroStudios

+2

I jeszcze raz "Opcja Strict On" zapisała dzień. –

Odpowiedz

8

Jeśli dwa operandy mają różne typy danych, wynikiem wyrażenia arytmetycznego będzie typ danych, który jest bardziej precyzyjny.

Ponieważ UInt64.MaxValue jest większa niż Int32.MaxValue dodanie UInt64 wartości do wartości Int32 daje Decimal (patrz Widening and Narrowing Conversions) nie jest Int32 której zasięg jest zbyt mała w porównaniu z UInt64. Wynik może być również ujemny, więc UInt64 również nie jest dobrą alternatywą. W rzeczywistości nie istnieje żadna niejawna konwersja z żadnego innego integralnego typu, nawet Int64 (Long), ponieważ zakres jest mniejszy.

Dlatego pojawia się błąd kompilatora, jeśli próbujesz ponownie przypisać wynik do UInt64 vaue.

albo trzeba go obsada:

myULong = CULng(myULong + 1) 

lub (lepiej) używać 1UL w pierwszej kolejności:

myULong += 1UL 

MSDN:

typu niebezpieczne konwersji, powodują błąd kompilacji z opcją Strict On. Na przykład, jeśli spróbujesz dodać zmienną Integer do zmiennej Double i przypiszesz wartość do zmiennej Integer, wystąpi błąd kompilatora , ponieważ nie można niejawnie przekonwertować zmiennej Double na typ Integer.

Nawiasem mówiąc, C# będzie automatycznie używać odpowiedniego typu, więc kompiluje:

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

niniejsza nie będzie skompilować

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

Dlaczego nie UInt64 + [U] Int32 -> [U] Int64? – user2864740

+2

Czy 'myULong + = 1UL' nie zadziała? (Nie jestem zaznajomiony z VB, .NET lub VS) – nhgrif

+1

@ user2864740 Ponieważ Int32 może być liczbą ujemną.Rozważmy trochę pozytywny UInt64 mniej niż Abs (Int32.Min) dodany do Int32.Min. Wynik byłby liczbą ujemną. – nhgrif

Powiązane problemy