Come prima cosa ringrazio Massimo Prota per i suoi complimenti davvero graditi e ne aprofitto per rispondere al suo
Blog delineando il futuro dei
NullableTypes
dopo i Nullable<T>.
0) I Nullable<T> confermano che i NullableTypes vanno a colmare una carenza reale del .NET Framework 1.*
1) I NullableTypes continueranno ad essere utili anche con il .NET Framework 2.0 che contiene i Nullable<T> pur senza esserne un doppione
2) I NullableTypes si integreranno perfettamente con i Nullable<T> sfruttandone le potenzialità (in particolare per la serializzazione, il Remoting ed i Web Services)
3) I NullableTypes complementeranno i Nullable<T> fornendo quelle funzionalità che i Nullable<T> non hanno a causa della tecnica di implementazione impiegata (i generics di C# che sono privi delle 'user specializations'). Le funzionalità specializzate per ogni tipo built-in sono:
- costruttori personalizzati per ogni tipo
- operatori personalizzati per ogni tipo
- concersioni personalizzate per ogni tipo
- implementazione del pattern Null Object
per evitare di tempestare il codice con if is-null then ... else ...
bye (luKa)
P.S. La spiegazione dettagliata segue.
Come i Templates di C++, i generics hanno lo scopo principale di essere applicabili ai tipi definiti dall'utente. Infatti vengono anche chiamati "polimorsifmo parametrico" e "polimorfismo compile-time".
Un esempio d'uso sono le collezioni tipizzate (che invece di Item di tipo Object hanno Item del tipo definito dall'utente).
I Nullable<T> hanno lo scopo principale di permettere ai value-type definiti dall'utente (alle struct) di assumere il valore null. Certo i Nullable<T> possono essere utilizzati specificando un tipo predefinito come Type Argument ma questo è un fatto secondario.
La cosa rilevante e' l'assenza delle 'user specializations' nei generics di C# impediscono di personalizzare il comportamento di ogni Constructed Type cioè per esempio di distingure i costruttori di Nullable<DateTime> da quelli di Nullable<Boolean> o l'operatore Nullable<Int32>.operator== da quello di Nullable<Double> e così via.
Siccome le differenze da un tipo built-in all'altro non sono trascurabili... i Nullable<T> hanno solo in sottoinsieme comune di funzioni.
Ecco una lista delle differenze:
- String and Boolean types don't implement Operator< and Operator> for good reasons while other .NET built-in types do it
- Single and Double Operator== follow IEC 60559:1989 (IEEE 754) specifications while other .NET built-in types follow CLR specifications for Operator==
- Some .NET built-in type allow conversion that do not make sense for other operators (i.e. Int32 have a conversion operator to Double while DateTime don't)
- ... e molte altre
La versione specializzata, con tutte le funzionalità, sarà ancora una volta offerta dai NullableTypes! :-)