Conversione di tipi nullable

di il
2 risposte

Conversione di tipi nullable

Buongiorno, sto testando un metodo che prevede, tra gli altri, l'argomento value As Object che in certi
casi, che non sto a spiegare, è certamente di tipo numerico intero nullable sicuramente convertibile
nel tipo Long? (ossia Nullable(Of Long), come ad esempio Byte?, SByte? e Integer?).

Mi sono accorto di una anomalia che riproduco in maniera riassuntiva nelle seguenti righe di codice e della
quale non so darmi una spiegazione.
Dim n1 As Integer? = 10
Dim obj1 As Object = n1
Dim n2 As Long? = CType(obj1, Long?)
Dim obj2 As Object = n2 'Questa istruzione solleva un'eccezione di tipo InvalidCastException "Cast specificato non valido".
Mi aiutate a capire perché l'ultima riga solleva un'eccezione?
Grazie in anticipo e buona giornata.

2 Risposte

  • Re: Conversione di tipi nullable

    Antologiko ha scritto:


    Buongiorno, sto testando un metodo che prevede, tra gli altri, l'argomento value As Object che in certi
    casi, che non sto a spiegare, è certamente di tipo numerico intero nullable sicuramente convertibile
    nel tipo Long? (ossia Nullable(Of Long), come ad esempio Byte?, SByte? e Integer?).
    [...]
    Mi aiutate a capire perché l'ultima riga solleva un'eccezione?
    Per iniziare, non è l'ultima riga che ti solleva una eccezione, bensì la penultima ovvero questa:
    Dim n2 As Long? = CType(obj1, Long?)
    La motivazione deriva dal fatto che puoi convertire un Value Type di tipo Integer (o Int32) in un valore Long, ma in quel caso stai convertendo un oggetto (quindi un Reference Type) tra due tipi che non hanno una radice comune.

    In altri termini, Nullable(of Long) e Nullable(of Integer) sono due tipi entrambi specializzazione del tipo generico Nullable.

    Nella gerarchia di classi quindi, potresti considerarli "fratelli" tra di loro ma comunque non "padre/figlio", da qui l'impossibilità di eseguire la conversione.

    Per esemplificare anche se in modo estremo e non del tutto corretto, è come se tu pretendessi di poter assegnare un istanza di List(Of Long) a una variabile di tipo List(Of Integer): quando parti da un tipo generico e lo "specializzi" andando a indicare i tipi specifici su cui deve basarsi, stai creando di fatto un nuovo tipo.

    Ciao!
  • Re: Conversione di tipi nullable

    Grazie della chiara spiegazione. Mi sono fidato troppo del debugger che si ferma sottolineando la riga successiva.
    Così tutto torna ad avere senso.
    Buona giornata!
Devi accedere o registrarti per scrivere nel forum
2 risposte