"DateTime?" 和 "DateTime" 之间的区别是什么?(尝试从日期选择器中获取值)

3
我对WPF和C#都很新,所以请不要责怪我问这个可能有点傻的问题。
我有一个WPF应用程序,其中包含两个日期选择器。当它们改变时,我想从中获取DateTime并将其用作应用程序中其他内容的变量。因此,对于每个日期选择器,我有类似于以下内容的方法(该方法是由VS自动生成的):
private void datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            date1 = datePicker1.SelectedDate;
        }

但问题在于datepicker中的日期是格式DateTime?而不是DateTime,我真的不知道那个问号是什么意思,为什么会出现。我尝试了一些研究,但没有找到任何有用的信息。如果您知道从datepicker获取日期的更好方法,也可以帮助我。我只需要在我的xaml.cs代码中使用它,而不是在xaml中,并且我不太想使用绑定,因为我不确定它是否符合我在这种情况下所需的要求。
谢谢任何答案。
编辑:我想添加的信息是它向我显示以下错误:
Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)
5个回答

14

带有 ? 的 DateTime 是 Nullable DateTime,它可以保存空值。对于您的情况,您可以执行以下操作:

private void datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
    if(datePicker1.SelectedDate.HasValue)
         date1 = datePicker1.SelectedDate.Value;
}

C# 中的 Nullable<T>

在 C# 和 Visual Basic 中,你可以使用 ? 符号将值类型标记为可空。例如,在 C# 中使用 int? ,在 Visual Basic 中使用 Integer? 可以声明一个整数值类型,该类型可以赋值为 null。


奇怪...我在那里添加了.Value,但如果没有if语句就无法工作...好的谢谢 :) - Ms. Nobody
1
@goodfriend,不客气,是的,这很奇怪,它应该只显示Value就可以工作,但检查HasValue也是好的。 - Habib

0
//Created Date without empty or nullable
public DateTime CreatedDate { get; set; }

//with Nullable or empty
public DateTime? UpdatedDate { get; set; }
public DateTime? DeletedDate { get; set; }

结果查看:点击这里


0

可空的 DateTime 可以为 null。

DateTime 结构体本身不提供空选项。但是 DateTime? 可空类型允许将 null 文字赋值给 DateTime 类型。它在对象模型中提供了另一层间接性。

使用空 DateTime 结构的程序:C#

using System;

class Program
{
    static void Main()
    {
    //
    // Declare a nullable DateTime instance and assign to null.
    // ... Change the DateTime and use the Test method (below).
    //
    DateTime? value = null;
    Test(value);
    value = DateTime.Now;
    Test(value);
    value = DateTime.Now.AddDays(1);
    Test(value);
    //
    // You can use the GetValueOrDefault method on nulls.
    //
    value = null;
    Console.WriteLine(value.GetValueOrDefault());
    }

    static void Test(DateTime? value)
    {
    //
    // This method uses the HasValue property.
    // ... If there is no value, the number zero is written.
    //
    if (value.HasValue)
    {
        Console.WriteLine(value.Value);
    }
    else
    {
        Console.WriteLine(0);
    }
    }
}

输出

0
9/29/2009 9:56:21 AM
9/30/2009 9:56:21 AM
1/1/0001 12:00:00 AM

最初发现这里

祝你好运!


0

你不能创建一个没有任何值(即 null)的 DateTime。它总是有一个默认值 (DateTime.MinValue)。

另一方面,DateTime? 是围绕 DateTime 的一种包装器,允许你将其保持为未定义状态。这非常有用,例如,如果你想让用户留空其中一个日期字段(未选择日期 = Null)。

请记住,你需要在与此相关的任何方法的参数类型中使用 DateTime?。如果你依赖其他库,或者必须将此数据传递给其他组件等,则有时可能会遇到尴尬的情况。

典型挑战/决策:
"我在组件X中使用DateTime?,它与使用DateTime的组件Y通信 - 我应该重写Y以处理DateTime?,还是将任何值为NullDateTime?对象转换为值为DateTime.MinValueDateTime对象来表示未选择/无效日期?或者也许我应该让它在Y中抛出异常...?""

当使用DateTime?时,请注意并考虑这些问题。


0

可空的DateTime可以为null。DateTime结构本身并不提供null选项。但是“DateTime?”可空类型允许您将null字面量分配给DateTime类型。它提供了另一层间接性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接