Bredda och begränsa konverteringar (Visual Basic)
Ett viktigt övervägande med en typkonvertering är om resultatet av konverteringen ligger inom måldatatypens intervall.
En utvidgad konvertering ändrar ett värde till en datatyp som kan tillåta alla möjliga värden för de ursprungliga data. Vidgade konverteringar bevarar källvärdet men kan ändra dess representation. Detta inträffar om du konverterar från en integraltyp till Decimal
, eller från Char
till String
.
En begränsad konvertering ändrar ett värde till en datatyp som kanske inte kan innehålla några av de möjliga värdena. Till exempel avrundas ett bråkvärde när det konverteras till en integraltyp och en numerisk typ som konverteras till Boolean
reduceras till antingen True
eller False
.
Breddning av konverteringar
I följande tabell visas standardbreddningskonverteringar.
Datatyp | Breddar till datatyper 1 |
---|---|
SByte | SByte , Short , Integer , Long , Decimal , , , Single Double |
Byte | Byte , Short , UShort , Integer , UInteger , Long , , ULong , Decimal , , Single Double |
Kort | Short , Integer , Long , Decimal , , , Single Double |
UShort | UShort , Integer , UInteger , Long , ULong , , Decimal , , Single Double |
Heltal | Integer , Long , Decimal , Single , , Double 2 |
UInteger | UInteger , Long , ULong , Decimal , , Single , Double 2 |
Lång | Long , Decimal , Single , Double 2 |
ULong | ULong , Decimal , Single , Double 2 |
Decimal | Decimal , Single , Double 2 |
Enda | Single , Double |
Dubbel | Double |
Alla uppräknade typer (uppräkning) | Dess underliggande integraltyp och alla typer som den underliggande typen breddas till. |
Char | Char , String |
Char Array |
Char Array String |
Alla typer | Objekt |
Alla härledda typer | Alla bastyper som den härleds från 3. |
Alla typer | Alla gränssnitt som implementeras. |
Ingenting | Alla datatyper eller objekttyper. |
1 Per definition breddas varje datatyp till sig själv.
2 Konverteringar från Integer
, UInteger
, Long
, ULong
, eller Decimal
till eller Double
kan leda till Single
förlust av precision, men aldrig i förlust av omfattning. I den meningen medför de inte informationsförlust.
3 Det kan verka förvånande att en konvertering från en härledd typ till en av dess bastyper utvidgas. Motiveringen är att den härledda typen innehåller alla medlemmar av bastypen, så den kvalificerar sig som en instans av bastypen. I motsatt riktning innehåller bastypen inga nya medlemmar som definierats av den härledda typen.
Vidgade konverteringar lyckas alltid vid körning och medför aldrig dataförlust. Du kan alltid utföra dem implicit, oavsett om alternativet Strikt -instruktion anger typkontrollväxeln till On
eller till Off
.
Begränsa konverteringar
Standardkonverteringarna omfattar följande:
Omvända riktningar för de vidgade konverteringarna i föregående tabell (förutom att varje typ vidgas till sig själv)
Konverteringar i båda riktningarna mellan boolesk och valfri numerisk typ
Konverteringar från valfri numerisk typ till valfri uppräkningstyp (
Enum
)Konverteringar i endera riktningen mellan Sträng och valfri numerisk typ,
Boolean
, eller DatumKonverteringar från en datatyp eller objekttyp till en typ som härleds från den
Begränsade konverteringar lyckas inte alltid vid körning och kan misslyckas eller medföra dataförlust. Ett fel uppstår om måldatatypen inte kan ta emot värdet som konverteras. En numerisk konvertering kan till exempel resultera i ett spill. Kompilatorn tillåter inte att du utför begränsade konverteringar implicit om inte alternativet Strikt-instruktion anger typkontrollväxeln till Off
.
Kommentar
Felet narrowing-conversion ignoreras för konverteringar från elementen i en For Each…Next
samling till loopkontrollvariabeln. Mer information och exempel finns i avsnittet "Begränsa konverteringar" i För varje... Nästa instruktion.
När du ska använda smala konverteringar
Du använder en begränsad konvertering när du vet att källvärdet kan konverteras till måldatatypen utan fel eller dataförlust. Om du till exempel har en String
som du vet innehåller antingen "True" eller "False" kan du använda nyckelordet CBool
för att konvertera det till Boolean
.
Undantag under konvertering
Eftersom utvidgning av konverteringar alltid lyckas utlöser de inte undantag. Om konverteringarna minskar, när de misslyckas, utlöser de oftast följande undantag:
InvalidCastException — om ingen konvertering har definierats mellan de två typerna
OverflowException — (endast integraltyper) om det konverterade värdet är för stort för måltypen
Om en klass eller struktur definierar en CType-funktion som ska fungera som en konverteringsoperator till eller från den klassen eller strukturen, kan det utlösa alla undantag som CType
den anser vara lämpliga. Dessutom kan det CType
anropa Visual Basic-funktioner eller .NET Framework-metoder, vilket i sin tur kan utlösa en mängd olika undantag.
Ändringar under referenstypkonverteringar
En konvertering från en referenstyp kopierar bara pekaren till värdet. Själva värdet kopieras inte eller ändras på något sätt. Det enda som kan ändras är datatypen för variabeln som innehåller pekaren. I följande exempel konverteras datatypen från den härledda klassen till dess basklass, men objektet som båda variablerna nu pekar på är oförändrat.
' 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