2013-10-27 9 views
6

ottengo il seguente errore:Operatore '??' Non può essere applicato a operandi di tipo 'System.DateTime'

Operator '??' cannot be applied to operands of type 'System.DateTime' 

foreach (EndServReward r in reward) 
          { 
           if (con.State == ConnectionState.Closed) 
           { 
            con.Open(); 
           } 
           myIfxCmd.Parameters[0].Value = r.EmpNum ; 
           myIfxCmd.Parameters[1].Value = (r.ServDate) ?? DBNull.Value; 
          } 

dove reward is List<EndServReward> reward, perché questo accade, e come risolvere il problema?

risposta

11

?? è l'operatore a coalescenza nulla.
Non ha senso applicarlo a un valore che non può essere null.

+0

Perché 'r.ServDate' non può essere' null'? !!Voglio controllare se quelle sono proprietà vuote o non impostate (riempite) con valori –

+2

@just_name Ecco perché non può essere null: http://msdn.microsoft.com/en-us/library/vstudio/1t3y8s4s.aspx –

+0

allora cosa succede se non imposto queste proprietà e inserisco nel db, questo fa errori? –

6

L'operatore nullcoaling non può essere applicato per impostazione predefinita su un tipo che è intrinsecamente non annullabile come DateTime. Se si desidera utilizzarlo comunque, è necessario prevedere l'utilizzo di DateTime come tipo nullable, utilizzando ad es. DateTime? dt;

3

La tua struttura r.ServDate deve essere annullabile:

public DateTime? ServDate { get; set; } 

DateTime di default non è annullabile

2

DateTime è un ValueType. I tipi di valore non sono annullabili: portano sempre un certo valore.

Questo è lo stesso per gli interi, raddoppia, ecc

L'operatore si utilizza controlla se il valore è nullo, quindi non è necessario.

Tuttavia, si potrebbe considerare di controllare il valore rispetto a un valore di base, come Min. Devi effettivamente considerare quale è il valore predefinito di questa variabile, se questo è accettabile, e quindi controllarlo.

Ancora una volta, si consideri un int. Non lo si controlla contro null, ma è possibile verificarlo con zero o negativi.

3

è possibile modificare il tipo di nullable come suggerito in altre risposte, o aggiungere un metodo di supporto come questo per il tuo codice:

private bool IsDefault<T>(T value) 
{ 
    if (value == null) 
     return false; 
    return value.Equals(default(T)); 
} 

quindi modificare il codice a questo:

myIfxCmd.Parameters[1].Value = IsDefault<DateTime>(r.ServDate) ? (object)DBNull.Value : (object)r.ServDate; 
1

Come sottolineato giustamente in altre risposte, non è possibile utilizzare l'operatore Null-Coalescing su un tipo di valore -DateTime.

Prima di provare a assegnare myIfxCmd.Parameters[1].Value con Null. La prima domanda è: come si imposta il valore predefinito della proprietà ServDate nella classe EndServReward? Piuttosto facendo la conversione in null o DateTime.Min meglio impostare un valore predefinito per ServData quando si crea l'oggetto stesso. Ciò aiuterà a decidere la funzionalità in un unico posto e a fornire una soluzione coerente.

È possibile scegliere come DateTime.Min o Null quando si crea questo anziché sul punto di aggiornarlo nel database.