代码之家  ›  专栏  ›  技术社区  ›  Dalbir Singh

System.datetime?与系统日期时间比较

  •  26
  • Dalbir Singh  · 技术社区  · 16 年前

    我在写一些代码,需要从页面中的日历控件(Ajax工具箱:CalendarExtender)中读取日期值。

    下面的代码:

    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”类型的变量中,而无需强制转换。

    谢谢

    6 回复  |  直到 8 年前
        1
  •  46
  •   Marek    16 年前

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

    Nullable是编译器支持的围绕值类型的包装,它允许值类型变为空。

    要访问日期时间值,需要执行以下操作:

    DateTime? dateOrNull = myCalendarExtender.SelectedDate;
    if (dateOrNull != null)
    {
        DateTime newSelectedDate = dateOrNull.Value;
    }
    
        2
  •  21
  •   Frederik Gheysels    8 年前

    DateTime? 是一样的 Nullable<DateTime> 这是:一个 日期时间? 不能包含“null”,而 DateTime 没有。 (对于.NET 2.0之后的所有值类型都是如此。值类型不能包含空值,但从.NET 2.0开始,通过 Nullable<T> 构造(还是?速记)

    你能得到日期时间的值吗?通过这样做将其放入日期时间:

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

    另一种获取可空值的简洁方法是使用空合并运算符:

    DateTime myDate = someNullableDate?? default(DateTime);
    
        3
  •  10
  •   Chris Marisic    16 年前

    一个更好的解决方案,IMO是所有可空类中最好的特性

    DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();
    
        4
  •  9
  •   Travis Heseman    16 年前

    日历控件返回一个可为空的<datetime>(C is datetime?)在其SelectedDate属性中,因为datetime是一个结构。空值允许控件具有“未选择日期”状态。因此,在您可以使用nullable之前,您需要检查它是否具有值。

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

    编辑:更加简洁,多亏了乔希的评论:

    var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;
    

    我喜欢它!

        5
  •  2
  •   Josh    16 年前

    你能用吗??操作员以非常简洁的方式使用C中的空值。请参阅我对Travis答案的评论,以更简短的方式表达“如果不为空,则使用它,否则使用一些默认值”概念。他们都做同样的事情。

        6
  •  -1
  •   Ken yang    8 年前
    var Endtime = DateTime.Now();
    DateTime startTime = item.REPORT_TIME.HasValue ? item.REPORT_TIME.Value : Endtime;
    

    表示:item.item.report的类型“时间”是System.DateTime?
    howeserver starttime的类型是system.datetime; 所以代码可以像

    ` var endtime=datetime.now; var starttime=item.report_time.hasValue?convert.todatetime(item.report\u time.hasValue):结束时间

    `