2013-10-27 97 views
6

我得到以下錯誤:運算符'??'不能應用於類型 '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; 
          } 

其中reward is List<EndServReward> reward,爲什麼出現這種情況,如何解決?

回答

11

??是空合併運算符。
將它應用於不能爲null的值是沒有意義的。

+0

爲什麼'r.ServDate'不能'null'?!!我想檢查,如果這些是空屬性或未設置(填充)值 –

+2

@just_name這就是爲什麼它不能爲空:http://msdn.microsoft.com/en-us/library/vstudio/1t3y8s4s.aspx –

+0

那麼如果我沒有設置這些屬性並插入數據庫,這會產生任何錯誤? –

6

默認情況下,nullcoalescing運算符不能應用於類似於DateTime的內在不可空的類型。如果您仍希望使用它,則必須預見使用DateTime作爲可空類型,例如使用例如。 DateTime? dt;

3

你r.ServDate屬性需要可空:

public DateTime? ServDate { get; set; } 

日期時間在默認情況下是不可爲空

2

的DateTime是值類型。價值類型不可爲空 - 它們總是帶有一些價值。

這是整數一樣,雙打等

經營者使用的是檢查,如果該值爲空,所以它是沒有必要的。

但是,您可能會考慮檢查該值與基準值(如最小值)。你實際上要考慮這個變量的默認值是什麼,如果這是可以接受的,然後檢查它。

再次考慮一個int。你不檢查null,但你可以檢查零或負面。

3

您可以更改可空類型在其他的答案建議,或這樣添加輔助方法代碼:

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

然後將代碼改成這樣:

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

正如在其他答案中指出的那樣,您不能在值類型-DateTime上使用Null-Coalescing運算符。

在嘗試分配myIfxCmd.Parameters[1].ValueNull之前。第一個問題是你在EndServReward類中設置ServDate屬性的默認值是什麼?相反,當您創建對象本身時,轉換爲nullDateTime.Min時應該更好地爲ServData設置默認值。這將有助於在一個地方決定功能並提供一致的解決方案。

您可以選擇它作爲DateTime.MinNull,而不是在將其更新到數據庫時。

相關問題