【发布时间】:2011-05-31 15:11:19
【问题描述】:
请检查以下代码
DateTime? tmp = new DateTime();
tmp = null;
return tmp.ToString();
它返回String.Empty。
对吗?
在第二行代码中引发异常可能会更好
【问题讨论】:
请检查以下代码
DateTime? tmp = new DateTime();
tmp = null;
return tmp.ToString();
它返回String.Empty。
对吗?
在第二行代码中引发异常可能会更好
【问题讨论】:
是的,没错。来自documentation
如果
HasValue属性为真,则为当前Nullable<T>对象的值的文本表示形式;如果HasValue属性为假,则为空字符串("")。
还要注意Nullable<T>.Equals 和Nullable<T>.GetHashCode 在这种情况下不会抛出,但Nullable<T>.GetType 会 抛出。这是因为Object.Equals、Object.GetHashCode 和Object.ToString 被Nullable<T> 覆盖,但Object.GetType 没有被覆盖(因为它不能被标记为virtual)。
【讨论】:
HasValue 为 false 的可空类型不是 null 引用。从概念的角度来看,可为空的类型表示一个值类型,该值可能“丢失”。我们使用null 来表示何时缺少值,但这与null 引用不同。请注意,tmp.Value 将在 tmp 是可空类型的实例且 HasValue 为 false 的情况下抛出。缺少该值,因此尝试获取所述值应该并且确实会相应地抛出。