Claudio Brotto

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.

Posted: ago 13 2005, 01.21 by devlizard | with no comments
Filed under: