【问题标题】:Assigning `null` value to Nullable<DateTime> with single line 'if'使用单行“if”将“null”值分配给 Nullable<DateTime>
【发布时间】:2012-10-12 08:25:28
【问题描述】:

我有这样的课程

public class MyClass
{
    public int Id { get; set; }
    public Nullable<DateTime> ApplicationDate { get; set; }
    ....
}

现在我正在尝试像这样填充MyClass 的对象

DataTable dt = DBHelper.GetDataTable(sql, conn);
DataRow dr = dt.Rows[0];

MyClass oMyClass = new MyClass();
oMyClass.Id = (int)dr["Id"];
oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? null : Convert.ToDateTime(dr["AppDate"]); 
//Above line gives an error
....

分配应用程序日期值会出错

Type of conditional expression cannot be determined because there is no implicit conversion between '&lt;null&gt;' and 'System.DateTime'

我在这里错过了什么?

【问题讨论】:

    标签: c# datetime null


    【解决方案1】:

    您需要将null 转换为DateTime?

    oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value 
        ? (DateTime?)null 
        : Convert.ToDateTime(dr["AppDate"]); 
    

    这是因为编译器确定conditional operator 的结果类型的方式;行为是设计使然:

    first_expression 和 second_expression 的类型必须是 相同,或者必须存在从一种类型到另一种类型的隐式转换。

    由于null 本身是is of null type,因此没有从它或到它的转换,你需要通过强制转换来帮助编译器。

    【讨论】:

    • 不会null 也必须强制转换吗?似乎错误消息与nullSystem.DateTime 有关。
    • @Default: 是 null 是需要强制转换的,我的错。
    • 当我在这个页面上做类似的事情和这些答案时得到Nullable object must have a value,包括(DateTime?)null演员。
    • @vapcguy 必须表示“与此类似的东西”是不正确的。例如,您不能在结果对象上盲目访问Value,这就是Nullable&lt;T&gt; 的全部意义所在。
    • @Jon,唯一的区别是我正在测试一个空字符串,而不是dr["ApplDate"] == DBNull.Value。其他一切都一样。原来它在它后面的一行,不过,我将我的变量的.Value(我相当于上面的DateTime&lt;Nullable&gt; ApplicationDate - 我只是给它起了另一个名字)为我的OracleCommand分配了一个OracleParameter,这是OracleDbType.Date,并且数据库字段确实设置为接受空值。但我发现发生了什么。您不能将 (DateTime?)null 分配给 Oracle DATE 字段 - 它必须是 DBNull.Value
    【解决方案2】:
    oMyClass.ApplicationDate =
        dr["ApplDate"] == DBNull.Value ?
        (DateTime?)null :
        Convert.ToDateTime(dr["AppDate"]);
    

    所有编译器都知道,一件事的计算结果为null,另一件事的计算结果为DateTime。编译器会抱怨,因为它无法从一个转换为另一个,因此您可以将它们转换为可以同时为两个值的值。

    请注意,DateTime?Nullable&lt;DateTime&gt; 的缩写。
    另请注意,您只需转换 null 值,因为 DateTime?DateTime 之间存在隐式转换,因此编译器可以自行进行转换。

    【讨论】:

      【解决方案3】:

      试试这个:

      oMyClass.ApplicationDate = 
          dr["ApplDate"] == DBNull.Value ? (DateTime?)null : 
                                           Convert.ToDateTime(dr["AppDate"]); 
      

      您还可以将强制转换应用于最后一个表达式。

      【讨论】:

        【解决方案4】:

        您可以使用default,它将分配未初始化类型的默认值。

        oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? default(Nullable<DateTime>) : Convert.ToDateTime(dr["AppDate"]); 
        

        更多示例

        bool isHappy = default(bool); //isHappy = false
        int number = default(int); //number = zero
        string text = default(text); // text = null
        MyObject myObject = default(MyObject); // myObject = null
        DateTime? date = default(DateTime?); //date = null
        

        【讨论】:

          【解决方案5】:

          您需要将“null”转换为 Nullable

          试试这个代码:

          oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dr["AppDate"]);
          

          【讨论】:

            【解决方案6】:
            DateTime? dt = (DateTime?)null;
            

            Nullable<DateTime> dt = (Nullable<DateTime>)null;
            

            【讨论】:

              猜你喜欢
              • 2011-09-07
              • 2013-06-20
              • 2012-02-21
              • 1970-01-01
              • 2012-01-29
              • 1970-01-01
              • 2019-02-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多