如果默认值为null并转换为字符串会发生什么

时间:2012-05-07 15:57:06

标签: c#

更具体一点,我有DateTime?出生日期

我的问题是在这种情况下会发生什么:

lblBirthDate.Text = myObject.BirthDate.GetValueOrDefault().ToString();

如果BirthDate为null。我安装了resharper,并没有警告我,那里我可能有一个空问题......

3 个答案:

答案 0 :(得分:6)

如果BirthDatenull,则会获得默认实例DateTime的本地化字符串表示形式。也就是说,您将获得字符串表示形式为00:00:00.0000000,即0001年1月1日。

您没有收到ReSharper的警告,因为那里没有空问题。在Nullable<T>.GetValueOrDefault的空实例上调用Nullable<T>不是运行时异常。相反,如果您有一个null实例,则会获得默认值。这正是GetValueOrDefault的意思:如果ValueHasValue,则获取true,否则获取基础结构类型的默认值。

答案 1 :(得分:2)

我很确定GetValueOrDefault在null的情况下返回DateTime.MinValue

以下是一些处理空值的方法:

DateTime? myNullDate = null;

DateTime myDate;
myDate = myNullDate ?? DateTime.Now; // myDate => DateTime.Now
myDate = myNullDate ?? default(DateTime); // myDate => DateTime.MinValue
myDate = myNullDate.GetValueOrDefault(DateTime.Now); // myDate => DateTime.Now
myDate = myNullDate.GetValueOrDefault(); // myDate => DateTime.MinValue

答案 2 :(得分:0)

Resharper不会显示任何错误,因为DateTime的默认值是1/1/1 00:00:00。您可以使用默认运算符获取任何类型的默认值:

DateTime defaultDateTime = default(DateTime);

此值与DateTime.MinValue

完全相同

如果您需要使用空值,则必须将您的属性声明为可为空:

DateTime? BirthDay { get; set; };

可空的DateTime DateTime?支持调用ToString(),即使值为null也没有错误,如果是,则给出一个空字符串。然后你不必担心空值。

使用可为空的DateTime比使用特殊值表示缺失值更加一致,例如default(DateTime),即DateTime.MinValue;