Descrizione del difetto
Se si scriveva un'espressione complessa si potevano ottenere errori a run-time in casi molto particolari. Il malfunzionamento si manifestava se si scriveva il codice seguente:
MyClass doc = new()
if (doc && doc.objProp && doc.objProp.objSubProp)
...
Il modulo di debug cerca di evidenziare il se e per quale motivo il sistema entra o meno in un blocco IF.
Per farlo elenca il valore di tutte le parti dell'espressione booleana (doc, doc.objProp, doc.objProp.objSubProp).
Nelle versioni precedenti veniva protetto solo il primo puntatore, quindi, il codice di debug era il seguente:
MyClass doc = new()
if (doc != null) DTTObj.AddToken(..., doc!=null)
if (doc != null) DTTObj.AddToken(..., doc.objProp!=null)
if (doc != null) DTTObj.AddToken(..., doc.objProp.objSubProp!=null)
if (doc && doc.objProp && doc.objProp.objSubProp)
...
e la terza riga del debug generava errore se doc.objProp era uguale a null.
A partire dalla versione 19.5, invece, il codice generato è il seguente:
MyClass doc = new()
DTTObj.AddToken(..., doc!=null)
if (doc != null) DTTObj.AddToken(..., doc.objProp!=null)
if (doc != null && doc.objProp != null) DTTObj.AddToken(..., doc.objProp.objSubProp!=null)
if (doc && doc.objProp && doc.objProp.objSubProp)
...
In questo modo le varie chiamate al modulo di debug sono sempre protette ed è più semplice capire quale parte dell'espressione è False:
Soluzioni
Era sufficiente scrivere più IF innestati o, qualora non necessario, disattivare il modulo di debug per il metodo contenente l'espressione complessa.