Nullable types: cambiamenti dopo la beta 2
Tra ieri e
oggi sono usciti due post (Joe Duffy e Somasegar) a proposito
di un cambiamento nella gestione dei Nullable Types.
Le
modifiche, che dovrebbero essere presenti già nelle prossime CTP (si parla di Agosto),
coinvolgono principalmente le situazioni di boxing/unboxing.
Riassumendo,
dovrebbe accadere quanto segue (tutti gli esempi riguardano un Nullable<Int32>, ma il tutto si applica
ad ogni Nullable<T> where T :
ValueType
):
- Un Nullable<Int32>
x sottoposto ad operazione di boxing
genera:
- null se x == null
(x.HasValue == false)
- un
boxed Int32 in caso contrario
- E'
possibile effettuare unboxing da un boxed int ad un Nullable<Int32>
, ottenendo un tipo nullabile con valore interno corrispondente al
valore del boxed int.
A corollario di quanto
detto, il codice seguente :
Nullable<Int32> i =
null;
Object o = i; // boxing here
Console.WriteLine(o == null);
scriverà true a
console (con la Beta2 che ho installato il risultato è false).
Analogamente, il codice che segue:
Int32 i = 78;
Object o = i; // boxing here
Nullable<Int32> j =
(Nullable<Int32>) o; // unboxing here.
sarà
perfettamente valido, producendo un Nullable<Int32> , al contrario di quanto
accade oggi con la Beta2, che genera una InvalidCastException
alla terza riga.
Citando
direttamente dalla fonte, infatti (sottolineatura mia):
The outcome is that the
Nullable type is now a new basic runtime intrinsic
. It is still declared as a generic
value-type, yet the runtime treats it special
. One of the foremost changes is that
boxing now honors the null state. A
Nullabe int now boxes to become not a boxed Nullable int but a boxed int (or a
null reference as the null state may indicate.) Likewise, it is now possible to unbox
any kind of boxed value-type into its Nullable type
equivalent.
Il tutto risulta, a mio parere, estremamente più intuitivo.
Comunque, va sottolineato come evidentemente il feedback ricevuto da
Microsoft sia stato molto influente e abbastanza pressante, tanto da
indurre ad un cambiamento decisamente tardivo, se consideriamo che l'uscita
della RTM è ormai prossima e che le modifiche effettuate (leggete i link) non
siano state proprio minimali.