Problema di tipo nullable con?: Operatore condizionale

Qualcuno potrebbe spiegare perché funziona in C # .NET 2.0:

Nullable foo; if (true) foo = null; else foo = new DateTime(0); 

… ma questo non:

  Nullable foo; foo = true ? null : new DateTime(0); 

La seconda forma mi dà un errore di compilazione “Imansible determinare il tipo di espressione condizionale perché non esiste una conversione implicita tra” “e” System.DateTime “.”

Non che io non possa usare il primo, ma il secondo stile è più coerente con il resto del mio codice.

Questa domanda è già stata posta molte volte. Il compilatore ti sta dicendo che non sa come convertire null in un DateTime .

La soluzione è semplice:

 DateTime? foo; foo = true ? (DateTime?)null : new DateTime(0); 

Si noti che Nullable può essere scritto DateTime? che ti farà risparmiare un po ‘di battitura.

FYI (Offtopic, ma nifty e relativo ai tipi nullable) abbiamo un pratico operatore solo per i tipi nullable chiamato l’operatore coalescente null

 ?? 

Usato in questo modo:

 // Left hand is the nullable type, righthand is default if the type is null. Nullable foo; DateTime value = foo ?? new DateTime(0); 

È perché in un operatore ternario, i due valori devono essere risolti nello stesso tipo.

Un’altra soluzione simile a quella accettata è quella di utilizzare la parola chiave default C #. Sebbene definito con generici, è effettivamente applicabile a qualsiasi tipo.

Esempio di utilizzo applicato alla domanda dell’OP:

 Nullable foo; foo = true ? default(DateTime) : new DateTime(0); 

Esempio di utilizzo con la risposta corrente accettata:

 DateTime? foo; foo = true ? default(DateTime) : new DateTime(0); 

Inoltre, utilizzando l’ default , non è necessario specificare la variabile come nullable per assegnargli un valore null . Il compilatore assegnerà automaticamente il valore predefinito del tipo di variabile specifico e non verrà rilevato alcun errore. Esempio:

 DateTime foo; foo = true ? default(DateTime) : new DateTime(0); 

So che questa domanda è stata posta nel 2008 ed è ora 5 anni dopo, ma la risposta contrassegnata come risposta non mi soddisfa. La vera risposta è che DateTime è una struct, e come struct non è compatibile con null. Hai due modi per risolverlo:

Il primo è rendere nullo compatibile con DateTime (ad esempio, eseguire il cast null su DateTime? Come suggerisce il gentleman con 70 upvotes, o lanciare null su Object o su ValueType).

Il secondo è rendere compatibile DateTime con null (ad esempio, cast DateTime in DateTime?).