【问题标题】:System.DateTime? vs System.DateTime系统日期时间?与 System.DateTime
【发布时间】:2010-12-16 07:38:48
【问题描述】:

我正在编写一些代码,我需要从页面中的日历控件中读取日期值(Ajax 工具包:日历扩展器)。

以下代码:

DateTime newSelectedDate = myCalendarExtender.SelectedDate;

给出以下错误:

Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)

但是,通过插入演员表,我可以让代码工作:

DateTime newSelectedDate = (DateTime)myCalendarExtender.SelectedDate; // works fine!

日历控件(Ajax 工具包)的“SelectedDate”属性将数据类型描述为“System.DateTime?” ......显然是'?与所有这些有关。

当数据类型包含此符号 (?) 时究竟会发生什么...我假设我可以将“SelectedDate”属性直接应用到“DateTime”类型的变量中而无需强制转换。

谢谢

【问题讨论】:

    标签: c# asp.net datetime


    【解决方案1】:

    DateTime?Nullable<DateTime> 相同 也就是说:DateTime? 的实例可以包含“NULL”,而DateTime 的实例则不能。 (对于自 .NET 2.0 以来的所有值类型都是如此。值类型不能包含 NULL ,但从 .NET 2.0 开始,可以通过 Nullable<T> 构造(或 ? 简写)支持可空值类型。

    你能得到DateTime的值吗?并通过这样做将其放入 DateTime:

    DateTime? someNullableDate;
    DateTime myDate;
    
    if( someNullableDate.HasValue )
       myDate = someNullableDate.Value;
    

    获取 Nullable 值的另一种更简洁的方法是使用 null-coalescing 运算符:

    DateTime myDate = someNullableDate?? default(DateTime);
    

    【讨论】:

    • 这是一个比答案更好的解决方案。
    【解决方案2】:
    var Endtime = DateTime.Now();
    DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;
    

    意思是:item.item.REPORT_TIME的类型是system.DateTime?
    但是 startTime 的类型是 system.DateTime; 所以代码可以像

    一样改变它

    `var Endtime=DateTime.Now; var startTime=item.REPORT_TIME.HasValue?Convert.ToDateTime(item.REPORT_TIME.HasValue):Endtime

    `

    【讨论】:

    • 您能否格式化您的代码并详细解释一下?
    • 这是第一次给出答案,我会改变它。谢谢你的建议。
    【解决方案3】:

    Calendar 控件在其 SelectedDate 属性中返回 Nullable(C# 中的简写是 DateTime?),因为 DateTime 是一个结构。空值允许控件具有“未选择日期”状态。因此,您需要先检查 nullable 是否具有值,然后才能使用它。

    var nullable = myCalendarExtender.SelectedDate; var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;

    编辑:更加简洁,感谢 Josh 的评论:

    var newSelectedDate = myCalendarExtender.SelectedDate ??一些默认值;

    我喜欢!

    【讨论】:

    • 你可以用下面的代码来简化它: var newDate = nullable ??一些默认值;
    • 或者您可以根据我的回答跳过所有存在检查自己。
    • @Chris - 我同意;但是,有时我不想使用像 DateTime 这样的值类型的默认值...也许我希望 DateTime.Today 作为评估中的默认值。
    【解决方案4】:

    ?表示该类型可以为空。有关详细信息,请参见例如MSDN

    Nullable 是一个编译器支持的值类型包装器,它允许值类型变为 null。

    要访问 DateTime 值,您需要执行以下操作:

    DateTime? dateOrNull = myCalendarExtender.SelectedDate;
    if (dateOrNull != null)
    {
        DateTime newSelectedDate = dateOrNull.Value;
    }
    

    【讨论】:

    • @Marek - 你更喜欢原始网址?我为编辑道歉。
    • @Jeff:他也在他的编辑中添加了代码块,所以这很可能不是故意的改变......只是他在你编辑之前已经打开了编辑屏幕。
    • @Jeff:抱歉,这是无意的。我不知道你编辑了网址,我的编辑覆盖了你的。
    • 唷,我不确定这种事情是否有问题。 :D
    • 感谢所有回复的人,现在更有意义了! :)
    【解决方案5】:

    你可以使用 ??运算符在 C# 中以非常简洁的方式处理可空值。请参阅我对 Travis 的回答的评论,以更短的方式表达“如果不为空,则使用它,否则使用一些默认值”概念。他们都做同样的事情。

    【讨论】:

      【解决方案6】:

      一个更好的解决方案,IMO 是所有可空类的最佳功能

      DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
      

      【讨论】:

      • 我会说这是非常巧妙的解决方案。
      猜你喜欢
      • 2016-01-12
      • 1970-01-01
      • 2013-11-27
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多