Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Risultati inaspettati nell'uso di "IF" come operatore ternario e valori Nullable

    Sto rilevando un problema nell'uso di "IF" come operatore ternario in VB.NET.
    Esempio:
    Dim numero As Nullable(Of Decimal)
    Dim zero As Decimal

    If True Then
    numero = Nothing
    Else
    numero = (10 / zero)
    End If

    a questo punto "numero" continua a valere "Nothing" .
    In base alle specifiche d'uso di "IF come operatore ternario dovrei aspettarmi lo stesso risultato con la seguente espressione:
    numero = If(True, Nothing, (10 / zero))
    ma in realtà alla variabile "numero" viene assegnato il valore "0".

    Qualcuno è in grado di spiegarmi tale comportamente apparentemente anomalo?
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    77
    ciao benvenuto sul forum

    potresti entrare nel dettaglio di cosa vuoi fare magari capisco meglio

  3. #3
    Grazie per il benvenuto.

    Al di là dell'uso, se provi i due esempi di codice che ho postato, noterai che forniscono risultati diversi anche se in "apparenza" dovrebbero essere equivalenti.

    Credo che il problema sia nell'assegnazione del valore di ritorno di IF(...) ad una variabile di tipo "Nullable".

    Infatti se provi questi 2 esempi ottieni lo stesso fenomeno:
    Dim boo As Nullable(Of Boolean)

    If True Then
    boo = Nothing
    Else
    boo = True
    End If

    --> Qui "boo" è ancora "Nothing"

    boo = If(True, Nothing, True)

    -->Qui "boo" è "False", cioè viene valorizzato con il suo valore di default e non con "Nothing", come mi aspetto seguendo le specifiche Microsoft.

    Altro esempio:
    Dim dt As Nullable(Of Date)

    If True Then
    dt = Nothing
    Else
    dt = Today
    End If
    --> Qui "dt" è ancora "Nothing"
    dt = If(True, Nothing, Today)
    --> Qui "boo" è "#12:00:00 AM#" (valore di default).

    Tieni conto che in un codice più complesso il valore di ritorno non era nemmeno il default ma mi sembrava legato all'espressione verificata come primo argometo dell'istruzione IF(...)

    Se non ho garanzie che l'IF ternario sostituisca pienamente la sintassi classica non posso fidarmi ad usarlo.

    Grazie per la pazienza...

  4. #4

  5. #5
    Leggi bene la pagina al link che mi hai mandato:

    Note:

    Visual Basic 2008 introduces a new If operator that uses short-circuit evaluation. For more information, see If Operator.

    e poi vai a http://msdn.microsoft.com/en-us/library/bb513985.aspx

    Grazie, ciao

  6. #6
    Originariamente inviato da valter.mi
    Leggi bene la pagina al link che mi hai mandato:

    Note:

    Visual Basic 2008 introduces a new If operator that uses short-circuit evaluation. For more information, see If Operator.

    e poi vai a http://msdn.microsoft.com/en-us/library/bb513985.aspx

    Grazie, ciao
    vedi cosa succede a NON indicare il linguaggio?

  7. #7
    prova così

    codice:
    Dim dt As Nullable(Of DateTime)
    Dim NullDate As Nullable(Of DateTime)
    NullDate = Nothing ' ridondante....
    dt = If(True, NullDate, Today)

  8. #8
    In effetti il problema è dato dal compilatore che interpreta i valori restituiti in modo poco intuibile (vedi http://connect.microsoft.com/VisualS...dbackID=341263).

    Mi sembra di capire quindi che, per un uso corretto di "IF" ternario in caso di tipi Nullable, occorra che i valori restituiti siano del tipo di a cui verrano poi eventualmente assegnati (o comunque dove sia possibile una "Widening conversion").

    Se è necessario restituire "Nothing" occorre creare una variabile d'appoggio dello stesso tipo Nullable non inizializzata e utilizzarla per restituire il Nothing.

    Grazie per la dritta

    PS:
    ma veramente non avevi capito che parlavo di VB.NET 2008?
    Comunque concordo che la precisione è sempre utile

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.