Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ważną kwestią podczas konwersji typu jest to, czy wynik konwersji mieści się w zakresie docelowego typu danych.
Konwersja rozszerzająca zmienia wartość na typ danych, który może zezwalać na dowolną możliwą wartość oryginalnych danych. Konwersje rozszerzające zachowują wartość źródłową, ale mogą zmienić jej reprezentację. Dzieje się tak w przypadku konwersji z typu całkowitego na Decimal, lub z Char na String.
Konwersja zawężająca zmienia wartość na typ danych, który może nie być w stanie przechowywać niektórych możliwych wartości. Na przykład wartość ułamkowa jest zaokrąglana, gdy jest konwertowana na typ całkowity, a typ liczbowy konwertowany na Boolean jest redukowany do wartości True lub False.
Rozszerzanie konwersji
W poniższej tabeli przedstawiono standardowe konwersje rozszerzające.
| Typ danych | Rozszerzanie do typów danych 1 |
|---|---|
| SByte |
SByte, Short, , Integer, Long, Decimal, , SingleDouble |
| bajt |
Byte, Short, , , UShortIntegerUIntegerLongULongDecimalSingleDouble |
| krótki |
Short, , Integer, Long, Decimal, , SingleDouble |
| UShort |
UShort, Integer, , UInteger, LongULong, , Decimal, , SingleDouble |
| Liczba całkowita |
Integer, , Long, Decimal, SingleDouble2 |
| liczba całkowita UInteger |
UInteger, Long, , ULong, Decimal, SingleDouble2 |
| Długi |
Long, , Decimal, SingleDouble2 |
| ULong |
ULong, , Decimal, SingleDouble2 |
| dziesiętny |
Decimal, , SingleDouble2 |
| Pojedynczy |
Single, Double |
| Podwójne | Double |
| Każdy typ wyliczeniowy (Enum) | Jego podstawowy typ całkowity i dowolny typ, do którego rozszerza się podstawowy typ. |
| char |
Char, String |
Char tablica |
Char tablica String |
| Dowolny typ | Obiekt |
| Dowolny typ pochodny | Dowolny typ bazowy, z którego pochodzi 3. |
| Dowolny typ | Dowolny interfejs, który implementuje. |
| Nic | Dowolny typ danych lub typ obiektu. |
1 Zgodnie z definicją każdy typ danych rozszerza się na siebie.
2 Konwersje z Integer, UInteger, Long, ULong lub Decimal do Single lub Double mogą spowodować utratę precyzji, ale nigdy utraty wielkości. W tym sensie nie powodują utraty informacji.
3 Może się wydawać zaskakujące, że konwersja z typu pochodnego na jeden z jego typów podstawowych jest rozszerzana. Uzasadnieniem jest to, że typ pochodny zawiera wszystkie elementy członkowskie typu podstawowego, więc kwalifikuje się jako wystąpienie typu podstawowego. W odwrotnym kierunku, typ podstawowy nie zawiera żadnych nowych członków dodanych przez typ pochodny.
Konwersje rozszerzające zawsze kończą się powodzeniem w czasie wykonywania i nigdy nie powodują utraty danych. Zawsze można je wykonać niejawnie, niezależnie od tego, czy instrukcja Option Strict ustawia przełącznik sprawdzania typów na On lub na Off.
Zawężanie konwersji
Standardowe konwersje zawężające obejmują następujące elementy:
Odwrotne kierunki konwersji rozszerzających w poprzedniej tabeli (z wyjątkiem tego, że każdy typ rozszerza się na siebie)
Konwersje w dowolnym kierunku między Boolean a dowolnym typem liczbowym
Konwersje z dowolnego typu liczbowego na dowolny typ wyliczony (
Enum)Konwersje w dowolnym kierunku między ciągiem a dowolnym typem liczbowym,
Booleanlub dateKonwersje z typu danych lub typu obiektu na typ uzyskany z niego
Konwersje zawężające nie zawsze kończą się powodzeniem w czasie wykonywania i mogą zakończyć się niepowodzeniem lub spowodować utratę danych. Błąd występuje, jeśli docelowy typ danych nie może otrzymać przekonwertowanej wartości. Na przykład konwersja liczbowa może spowodować przepełnienie. Kompilator nie zezwala na niejawne wykonywanie konwersji zawężającej, chyba że instrukcja Option Strict ustawia przełącznik kontroli typów na Off.
Uwaga / Notatka
Błąd konwersji zawężającej jest pomijany dla konwersji z elementów kolekcji For Each…Next do zmiennej sterującej pętli. Aby uzyskać więcej informacji i przykładów, zobacz sekcję "Zawężanie konwersji" w temacie Dla każdego... Następna instrukcja.
Kiedy używać konwersji zawężania
Używasz konwersji zawężającej, gdy wiadomo, że wartość źródłowa może zostać przekonwertowana na docelowy typ danych bez błędu lub utraty danych. Jeśli na przykład masz String, o którym wiesz, że zawiera wartość "True" lub "False", możesz użyć słowa kluczowego CBool, aby przekonwertować ją na Boolean.
Wyjątki podczas konwersji
Ponieważ konwersje rozszerzające zawsze kończą się powodzeniem, nie zgłaszają wyjątków. Konwersje zawężające, w przypadku niepowodzenia, najczęściej wyrzucają następujące wyjątki:
InvalidCastException — jeśli nie zdefiniowano konwersji między dwoma typami
OverflowException — (tylko typy całkowite), jeśli przekonwertowana wartość jest zbyt duża dla typu docelowego
Jeśli klasa lub struktura definiuje funkcję CType , która będzie służyć jako operator konwersji do lub z tej klasy lub struktury, może zgłosić dowolny wyjątek, CType który uzna za odpowiedni. Ponadto niniejszy kod CType może wywoływać funkcje języka Visual Basic lub metody .NET Framework, które z kolei mogą zgłaszać różne wyjątki.
Zmiany podczas konwersji typów referencyjnych
Konwersja z typu odwołania kopiuje tylko wskaźnik do wartości. Sama wartość nie jest ani kopiowana, ani zmieniana w żaden sposób. Jedyną rzeczą, którą można zmienić, jest typ danych zmiennej trzymającej wskaźnik. W poniższym przykładzie typ danych jest konwertowany z klasy pochodnej na klasę bazową, ale obiekt, na który teraz wskazują obie zmienne, jest niezmieniony.
' Assume class cSquare inherits from class cShape.
Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square