Il problema che si osserva qui è un caso speciale di un problema più generale, che è che il numero di diverse definizioni di uguaglianza che possono essere utili in almeno alcune circostanze supera il numero di mezzi comunemente disponibili per esprimerle. Questo problema è in alcuni casi aggravato dalla sfortunata convinzione che sia fonte di confusione avere diversi mezzi per testare l'uguaglianza producendo risultati diversi, e tale confusione potrebbe essere evitata facendo in modo che le diverse forme di uguaglianza producano gli stessi risultati quando possibile.
In realtà, la causa fondamentale della confusione è la convinzione errata che le diverse forme di test di uguaglianza e disuguaglianza dovrebbero produrre lo stesso risultato, nonostante il fatto che semantica diversa sia utile in circostanze diverse. Ad esempio, da un punto di vista aritmetico, è utile poter avere Decimalche differiscono solo per il numero di zeri finali confrontare come uguali. Allo stesso modo per doublevalori come zero positivo e zero negativo. D'altra parte, dal punto di vista della memorizzazione nella cache o dell'internamento, tale semantica può essere mortale. Supponiamo, ad esempio, di avere un Dictionary<Decimal, String>tale che myDict[someDecimal]dovrebbe essere uguale someDecimal.ToString(). Un tale oggetto sembrerebbe ragionevole se ne avessi moltiDecimalvalori che si desiderava convertire in stringa e ci si aspettava che ci fossero molti duplicati. Sfortunatamente, se si usasse tale memorizzazione nella cache per convertire 12,3 me 12,40 m, seguiti da 12,30 me 12,4 m, questi ultimi valori restituirebbero "12,3" e "12,40" invece di "12,30" e "12,4".
Tornando alla questione in esame, c'è più di un modo sensato per confrontare gli oggetti nullable per l'uguaglianza. C # prende il punto di vista che il suo ==operatore dovrebbe rispecchiare il comportamento di Equals. VB.NET assume il punto di vista che il suo comportamento dovrebbe rispecchiare quello di alcuni altri linguaggi, poiché chiunque lo desideri Equalspotrebbe usarlo Equals. In un certo senso, la soluzione giusta sarebbe avere un costrutto "if" a tre vie e richiedere che se l'espressione condizionale restituisce un risultato a tre valori, il codice deve specificare cosa dovrebbe accadere nel nullcaso. Poiché questa non è un'opzione con le lingue così come sono, la prossima migliore alternativa è semplicemente imparare come funzionano le diverse lingue e riconoscere che non sono la stessa cosa.
Per inciso, l'operatore "Is" di Visual Basic, che manca in C, può essere utilizzato per verificare se un oggetto nullable è, in effetti, null. Sebbene ci si possa ragionevolmente chiedere se un iftest debba accettare a Boolean?, avere i normali operatori di confronto restituiti Boolean?piuttosto che Booleanquando invocati su tipi nullable è una caratteristica utile. Per inciso, in VB.NET, se si tenta di utilizzare l'operatore di uguaglianza anziché Is, si riceverà un avviso che il risultato del confronto sarà sempre Nothinge si dovrebbe usare Isse si vuole verificare se qualcosa è nullo.