使非null类可为空

时间:2013-01-30 11:17:29

标签: c# datetime

  

可能重复:
  DateTime “null” value

C#中有许多不是Nullable的内置类。 例如,Datetime,有时我想检查我的datatime对象是否为null但是我不被允许。如何将可空性插入日期时间类?

7 个答案:

答案 0 :(得分:4)

  

C#中有许多不可为Nullable的内置类。

他们(Datetime)是结构,它们是value types,而不是类,因此不可为空。

MSDN - Value Types

  

与引用类型不同,值类型不能包含空值。   但是,nullable types功能允许使用值类型   被指定为null。

您可以将Nullable<T>DateTime一起使用,使其可以为空。

DateTime? dateTimeObject = null;

带有?的问号DateTime使其成为Nullable。

  

语法T?是Nullable的简写,其中T是值类型。   这两种形式是可以互换的。

答案 1 :(得分:4)

简而言之,Structs是值类型。值类型必须始终有效(因此必须初始化结构构造函数中的所有成员)并且不能为null。

但是有作弊;

您可以使用Nullable<T>,否则可以将"T?"用作可以为空的引用中的值类型。

用法:

DateTime? foo = new DateTime(...);

foo.Value.<datetime member>

答案 2 :(得分:2)

足以使用?,就像

一样
DateTime? dt = null;

因此,您的可空类型变为Nullable Type

答案 3 :(得分:2)

您可以在类型的末尾添加字符?

DateTime? date;

答案 4 :(得分:2)

当然,您可以使用声明中的更改来设置整数,双精度,日期时间等。

DateTime? dt = null.

BUT

您需要注意两件事。

1)DateTime?和DateTime不是相同的数据类型,所以,如果你这样做:

DateTime? date1 = null;
date1 = DateTime.Now;

DateTime date2 = date1; // Wont work.

访问可空类型值的正确方法如下:

DateTime date2 = date1.Value;

2)第二个BUT是您需要在使用之前始终检查是否有值。

DateTime? date1 = null;
DateTime date2 = date1.Value;

这会抛出一个异常,“Nullable对象必须有一个值”。

因此,添加可空操作符并不是那么简单,每次要使用变量时都需要检查属性“HasValue”:

DateTime? date1 = DateTime.Now;
if(date1.HasValue)
{
    DateTime date2 = date1.Value;
}

明智地使用nullables。

答案 5 :(得分:1)

严格地说,DateTimestruct(即值类型),而不是class(它们是引用类型),这就是为什么它不可空。但是,Nullable<DateTime>,又名DateTime? 可以为空。 Nullable<T> struct由编译器进行特殊处理,使其工作非常像您期望的==!=(通过.HasValue)和大多数其他操作(通过所谓的“提升操作员”)。

答案 6 :(得分:1)

DateTimestruct,因此它是value types。值类型不能为null。除非您可以将nullable types用于DateTime或其他值类型;

  

Nullable类型是System.Nullable结构的实例。一个   可空类型可以表示其正确的值范围   基础价值类型,加上额外的空值

Nullable types 代表问号?。例如;

DateTime? date = null;
顺便说一下,

DateTime?System.Nullable<DateTime>相等。

如果您使用可空DateTime,则可以检查它是否具有值;

if(date.HasValue == true)

当然,您可以将它们与==!=

等等运算符一起使用