Tutti i post taggati come: ‘framework .net 2.0’

Jul
9

C# specifiche: gli operatori condizionali

Postato in  
Technology

Noi sviluppatori spesso ci troviamo ad usare, per comodità, gli operatori condizionali (operatori condizionali in c#).

1
a = condizione ? prima_espressione : seconda_espressione;

In passato ho anche affrontato la teoria relativa ai tipi nullable, che ricordo essere dei tipi che accettano il valore null.

Oggi mi è capitato un errore compile-time che, a prima vista, potrebbe sembrare piuttosto banale:

Type of conditional expression cannot be determined because there is no implicit conversion between ‘‘ and ‘System.DateTime’

Spulciando le specifiche del linguaggio c#, ho scoperto un’interessante regola di base che, onestamente, non conoscevo.

Regola:
Ipotizziamo che X ed Y siano i tipi del secondo e terzo operando nell’espressione condizionale.
1. Se X ed Y sono dello stesso tipo, ne consegue che questo tipo è il tipo dell’espressione condizionale.
2. Nel caso in cui X ed Y siano diversi:
2a. se esiste una conversione implicita da X ad Y ma non da Y ad X, allora Y è il tipo dell’espressione condizionale;
2b. se esiste una conversione implicita da Y ad X, ma non da X ad Y, allora X è il tipo dell’espressione condizionale;
3. Nei restanti casi, non è possibile determinare il tipo dell’espressione per cui il compilatore ritorna un errore.

Esempio:

1
2
DateTime? nullableDate;  
nullableDate = (condition) ? null : DateTime.Now;

In questo caso X è null, per cui non c’è nessun tipo ad esso associabile. Nè tantomeno esiste un cast che ci dice che sia un null riferibile ad un qualche tipo specifico.

Non esiste nessuna conversione implicita da X (null) ad Y (DateTime).
Non esiste nessuna conversione implicita da Y (DateTime) ad X (null).

Secondo la regola, quindi, il compilatore deve tornare un errore.

Ovviare a questo problema è semplice: bisogna far capire al compilatore quale sia il tipo dell’espressione condizionale. Per farlo possiamo: fare un cast di entrambe le espressioni a DateTime?, oppure ancora fare un cast di null a DateTime? o, infine, fare un cast da DateTime a DateTime? (in questi ultimi due casi, esisterebbe una conversione implicita)

Related Posts:

Feb
6

c#: tipi nullable (int? char? double? float?)

Postato in  
Technology

Recentemente ho scoperto, grazie ad uno sviluppatore conosciuto da poco, l’esistenza dei tipi nullable.
Introdotti a partire dal framework .net 2.0, consentono di assegnare ad una variabile il valore null, oltre il normale range di valori.

Nel caso di una variabile int, oltre il range di valori compreso tra -2147483648 e 2147483647, sarà possibile assegnare anche il valore null.

Ancora: nel caso in cui dovessimo definire una variabile di tipo bool, oltre ai due stati true e false, sarà possibile lavorare su un terzo stato, lo stato null.

Questa tipologia di dato torna utile soprattutto nel caso in cui dovessimo trovarci a testare il valore di una variabile cui associamo un dato estratto da un database. In condizioni normali, dovremmo usare il seguente costrutto:

1
2
3
4
if (valore == null)
    x = -1;
else
    x = valore;

i tipi nullable possiedono due proprietà pubbliche e read-only: hasValue e Value.

* HasValuerestituisce true nel caso la variabile abbia un valore diverso da null
* Valuerestituisce il valore assegnato alla variabile nel caso sia diverso da null, oppure un’eccezione InvalidOperationException;

Per cui, potremmo pensare di testare il valore estratto da un database nel seguente modo:

1
2
3
4
5
int? x = campo_db;
if (x.HasValue)
    System.Console.WriteLine(x.Value);
else
    System.Console.WriteLine("Undefined");

Related Posts: