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
Historia, Visual Basic ma go dużo . Będziesz musiał użyć '1UL' tutaj. –
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
I jeszcze raz "Opcja Strict On" zapisała dzień. –