DateTime? testDate = (DateTime?)arrayOfObjects[dateObject];
那段代码看起来不错吗?我试图使用as
运算符,但我得到了'不可为空'的错误。我想说的是我从数组中选择的对象是DateTime
或null DateTime
,但可以将其分配给testDate。
这样做感觉不对,我想我错过了一些明显的东西。
编辑:我认为这与我可以通过以下方式调整as
的方式相同:
DateTime? testDate = arrayOfObjects[dateObject] as DateTime?;
这两行代码是处理潜在空值的最佳方法吗?
答案 0 :(得分:4)
这两行代码是处理潜在空值的最佳方法吗?
当数组包含除DateTime之外的其他内容时,第二种形式将默默生成null
。这似乎是使用第一个的一个很好的理由。
基本问题:
我错过了什么,或者这是典型的(或至少是可接受的)方法
这是可以接受的,但也许有点模糊,因为它“隐藏”了一个拆箱操作 你可以使用:
DateTime? testDate = null;
if (arrayOfObjects[dateObject] != null)
testDate = (DateTime) arrayOfObjects[dateObject]; // no '?'
但那很冗长。而这个特殊问题并不适合条件运算符(?:
)
所以我会坚持你的第一个版本。
答案 1 :(得分:2)
的DateTime?是另一个结构的简短形式
Nullable<DateTime> {
bool HasValue;
DateTime Value;
}
您永远不会从您的数据库中获取此类型,因此第一行永远不会正确投射。数据库将为您提供存储在对象变量中的DateTime值。或null(无类型)。
DateTime是一个结构体,因此“as”运算符不适用于它。因此,只需按如下方式检查null:
DateTime? testDate = arrayOfObjects[dateObject] == null ? (DateTime?) null : (DateTime)arrayOfObjects[dateObject];
答案 2 :(得分:0)
更好的方法是做类似的事情:
if(arrayOfObjects[dateObject] != null && arrayOfObjects[dateObject] is DateTime)
{
DateTime testDate = (DateTime)arrayOfObjects[dateObject];
// logic here
}
或类似的东西:
DateTime? testDate = null;
if(arrayOfObjects[dateObject] is DateTime)
{
testDate = (DateTime)arrayOfObjects[dateObject];
}
else if (arrayOfObjects[dateObject] is Nullable<DateTime>)
{
testDate = (Nullable<DateTime>)arrayOfObjects[dateObject];
}
答案 3 :(得分:-1)
尝试使用Array.ConvertAll方法。以下是它的实施方式:
DateTime?[] dates = Array.ConvertAll<object, DateTime?>arrayOfObjects,DateTime);
注意:这只是一个粗略的想法。你可以纠正它以适合自己。