可能重复:
DateTime “null” value
C#中有许多不是Nullable的内置类。 例如,Datetime,有时我想检查我的datatime对象是否为null但是我不被允许。如何将可空性插入日期时间类?
答案 0 :(得分:4)
C#中有许多不可为Nullable的内置类。
他们(Datetime
)是结构,它们是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)
答案 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)
严格地说,DateTime
是struct
(即值类型),而不是class
(它们是引用类型),这就是为什么它不可空。但是,Nullable<DateTime>
,又名DateTime?
可以为空。 Nullable<T>
struct
由编译器进行特殊处理,使其工作非常像您期望的==
,!=
(通过.HasValue
)和大多数其他操作(通过所谓的“提升操作员”)。
答案 6 :(得分:1)
DateTime
是struct
,因此它是value types
。值类型不能为null
。除非您可以将nullable types
用于DateTime
或其他值类型;
Nullable类型是System.Nullable结构的实例。一个 可空类型可以表示其正确的值范围 基础价值类型,加上额外的空值。
Nullable types 代表问号?
。例如;
DateTime? date = null;
顺便说一下, DateTime?
与System.Nullable<DateTime>
相等。
如果您使用可空DateTime
,则可以检查它是否具有值;
if(date.HasValue == true)
当然,您可以将它们与==
和!=