Conversioni di ampliamento e restrizione (Visual Basic)Widening and Narrowing Conversions (Visual Basic)

Una considerazione importante per la conversione di un tipo è la possibilità che il risultato della conversione sia compreso nell'intervallo del tipo di dati di destinazione.An important consideration with a type conversion is whether the result of the conversion is within the range of the destination data type.

Una conversione verso un tipo di dati più ampio modifica un valore in un tipo di dati che può consentire qualsiasi valore possibile dei dati originali.A widening conversion changes a value to a data type that can allow for any possible value of the original data. Le conversioni verso un tipo di dati più ampio conservano il valore di origine ma possono modificarne la rappresentazione.Widening conversions preserve the source value but can change its representation. Questo errore si verifica se si esegue la conversione da un tipo integrale a Decimal o da Char a String.This occurs if you convert from an integral type to Decimal, or from Char to String.

Una conversione verso un tipo di dati più piccolo imposta un valore su un tipo di dati che potrebbe non contenere alcuni dei possibili valori.A narrowing conversion changes a value to a data type that might not be able to hold some of the possible values. Ad esempio, un valore frazionario viene arrotondato quando viene convertito in un tipo integrale e un tipo numerico convertito in Boolean viene ridotto a True o False.For example, a fractional value is rounded when it is converted to an integral type, and a numeric type being converted to Boolean is reduced to either True or False.

conversioni verso un tipo di dati più grandeWidening Conversions

Nella tabella seguente vengono illustrate le conversioni standard verso un tipo di ampliamento.The following table shows the standard widening conversions.

Tipo di datiData type Viene ampliato ai tipi di dati 1Widens to data types 1
SByteSByte SByte, Short, Integer, Long, Decimal, Single, DoubleSByte, Short, Integer, Long, Decimal, Single, Double
ByteByte Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, DoubleByte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
ShortShort Short, Integer, Long, Decimal, Single, DoubleShort, Integer, Long, Decimal, Single, Double
UShortUShort UShort, Integer, UInteger, Long, ULong, Decimal, Single, DoubleUShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
IntegerInteger Integer, Long, Decimal, Single, Double2Integer, Long, Decimal, Single, Double2
UIntegerUInteger UInteger, Long, ULong, Decimal, Single, Double2UInteger, Long, ULong, Decimal, Single, Double2
LongLong Long, Decimal, Single, Double2Long, Decimal, Single, Double2
ULongULong ULong, Decimal, Single, Double2ULong, Decimal, Single, Double2
DecimalDecimal Decimal, Single, Double2Decimal, Single, Double2
SingleSingle Single, DoubleSingle, Double
DoubleDouble Double
Qualsiasi tipo enumerato (enum)Any enumerated type (Enum) Il tipo integrale sottostante e qualsiasi tipo in cui viene ampliato il tipo sottostante.Its underlying integral type and any type to which the underlying type widens.
CharChar Char, StringChar, String
Matrice CharChar array matrice di Char, StringChar array, String
Qualsiasi tipoAny type OggettoObject
Qualsiasi tipo derivatoAny derived type Qualsiasi tipo di base da cui è derivato 3.Any base type from which it is derived 3.
Qualsiasi tipoAny type Qualsiasi interfaccia implementata.Any interface it implements.
NothingNothing Qualsiasi tipo di dati o tipo di oggetto.Any data type or object type.

1 per definizione, ogni tipo di dati viene ampliato a se stesso.1 By definition, every data type widens to itself.

2 le conversioni da Integer, UInteger, Long, ULong o Decimal a Single o Double possono comportare la perdita di precisione, ma mai in perdita di grandezza.2 Conversions from Integer, UInteger, Long, ULong, or Decimal to Single or Double might result in loss of precision, but never in loss of magnitude. In questo senso, non subiscono perdite di informazioni.In this sense they do not incur information loss.

3 potrebbe sembrare sorprendente che una conversione da un tipo derivato a uno dei relativi tipi di base sia più ampia.3 It might seem surprising that a conversion from a derived type to one of its base types is widening. La giustificazione è che il tipo derivato contiene tutti i membri del tipo di base, quindi è qualificato come un'istanza del tipo di base.The justification is that the derived type contains all the members of the base type, so it qualifies as an instance of the base type. Nella direzione opposta, il tipo di base non contiene i nuovi membri definiti dal tipo derivato.In the opposite direction, the base type does not contain any new members defined by the derived type.

Le conversioni verso un tipo di dati più ampio hanno sempre esito positivo in fase di esecuzione e non subiscono maiWidening conversions always succeed at run time and never incur data loss. È sempre possibile eseguirli in modo implicito, se l' istruzione Option Strict imposta l'opzione di controllo del tipo su On o su Off.You can always perform them implicitly, whether the Option Strict Statement sets the type checking switch to On or to Off.

conversioni verso un tipo di dati più piccoloNarrowing Conversions

Di seguito sono riportate le conversioni standard più strette:The standard narrowing conversions include the following:

  • Direzioni inverse delle conversioni verso un tipo di inverso più ampio nella tabella precedente, ad eccezione del fatto che ogni tipo viene ampliato a se stesso.The reverse directions of the widening conversions in the preceding table (except that every type widens to itself)

  • Conversioni in entrambe le direzioni tra il tipo booleano e qualsiasi tipo numericoConversions in either direction between Boolean and any numeric type

  • Conversioni da qualsiasi tipo numerico a qualsiasi tipo enumerato (Enum)Conversions from any numeric type to any enumerated type (Enum)

  • Conversioni in entrambe le direzioni tra stringa e qualsiasi tipo numerico, Boolean o DataConversions in either direction between String and any numeric type, Boolean, or Date

  • Conversioni da un tipo di dati o da un tipo di oggetto a un tipo derivato da essoConversions from a data type or object type to a type derived from it

Le conversioni verso un tipo di dati più piccolo non vengono sempre eseguite in fase di esecuzione e possono avere esito negativo o causare una perdita di dati.Narrowing conversions do not always succeed at run time, and can fail or incur data loss. Si verifica un errore se il tipo di dati di destinazione non è in grado di ricevere il valore da convertire.An error occurs if the destination data type cannot receive the value being converted. Una conversione numerica, ad esempio, può causare un overflow.For example, a numeric conversion can result in an overflow. Il compilatore non consente di eseguire in modo implicito le conversioni verso un tipo di caratteri più piccolo, a meno che l' istruzione Option Strict non imposti l'opzione di controllo del tipo su Off.The compiler does not allow you to perform narrowing conversions implicitly unless the Option Strict Statement sets the type checking switch to Off.

Nota

L'errore di conversione verso un tipo di ristringimento viene eliminato per le conversioni dagli elementi di una raccolta di For Each…Next alla variabile di controllo del ciclo.The narrowing-conversion error is suppressed for conversions from the elements in a For Each…Next collection to the loop control variable. Per ulteriori informazioni ed esempi, vedere la sezione relativa alle conversioni verso un tipo di dati più piccolo in per ciascuna... Istruzione successiva.For more information and examples, see the "Narrowing Conversions" section in For Each...Next Statement.

Quando usare le conversioni verso un tipo di caratteri più piccoloWhen to Use Narrowing Conversions

Si utilizza una conversione verso un tipo di dati più piccolo quando si sa che il valore di origine può essere convertito nel tipo di dati di destinazione senza errori o perdita di dati.You use a narrowing conversion when you know the source value can be converted to the destination data type without error or data loss. Se, ad esempio, si dispone di un String noto che contiene "true" o "false", è possibile utilizzare la parola chiave CBool per convertirlo in Boolean.For example, if you have a String that you know contains either "True" or "False," you can use the CBool keyword to convert it to Boolean.

Eccezioni durante la conversioneExceptions During Conversion

Poiché le conversioni verso un tipo di conversione più ampio hanno sempre esito positivo, non generano eccezioni.Because widening conversions always succeed, they do not throw exceptions. Le conversioni verso un tipo di testo più piccolo, in caso di errore, generano in genere le eccezioni seguenti:Narrowing conversions, when they fail, most commonly throw the following exceptions:

Se una classe o una struttura definisce una funzione CType che funge da operatore di conversione verso o da tale classe o struttura, tale CType può generare qualsiasi eccezione ritenuta appropriata.If a class or structure defines a CType Function to serve as a conversion operator to or from that class or structure, that CType can throw any exception it deems appropriate. Inoltre, è possibile che CType chiami funzioni Visual Basic o metodi .NET Framework, che a loro volta possono generare una serie di eccezioni.In addition, that CType might call Visual Basic functions or .NET Framework methods, which in turn could throw a variety of exceptions.

Modifiche durante le conversioni di tipi di riferimentoChanges During Reference Type Conversions

Una conversione da un tipo riferimento copia solo il puntatore al valore.A conversion from a reference type copies only the pointer to the value. Il valore stesso non viene copiato né modificato in alcun modo.The value itself is neither copied nor changed in any way. L'unica cosa che può cambiare è il tipo di dati della variabile che contiene il puntatore.The only thing that can change is the data type of the variable holding the pointer. Nell'esempio seguente il tipo di dati viene convertito dalla classe derivata alla relativa classe di base, ma l'oggetto a cui puntano entrambe le variabili è invariato.In the following example, the data type is converted from the derived class to its base class, but the object that both variables now point to is unchanged.

' 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  

Vedere ancheSee also