3
DateTime? testDate = (DateTime?)arrayOfObjects[dateObject];

那个代码看起来没问题吗?我尝试使用该as运算符,但出现“不可为空”错误。我想说的是,我从数组中选择的对象是DateTime或者是,null DateTime但要么可以分配给 testDate。

这样做感觉不对,我想我错过了一些明显的东西。

编辑:我想这与我可以as通过以下方式调整的方式相同:

DateTime? testDate = arrayOfObjects[dateObject] as DateTime?;

任何一行代码都是处理潜在空值的最佳方式吗?

4

4 回答 4

4

任何一行代码都是处理潜在空值的最佳方式吗?

null当数组包含 DateTime 以外的内容时,第二种形式将静默产生。这似乎是使用第一个的好理由。

对于基本问题:

我错过了什么还是这是典型的(或至少是可接受的)方法

这是可以接受的,但可能有点模糊,因为它“隐藏”了一个拆箱操作。
你可以使用:

DateTime? testDate = null;
if (arrayOfObjects[dateObject] != null)  
   testDate = (DateTime) arrayOfObjects[dateObject];  // no '?'

但这很冗长。而这个特殊问题并不适合条件运算符 ( ?:)

所以我会坚持你的第一个版本。

于 2012-06-28T14:24:56.607 回答
2

约会时间?是另一个结构的较短形式

Nullable<DateTime> {
    bool HasValue;
    DateTime Value;
}

你永远不会从你的数据库中得到这种类型,所以第一行永远不会正确转换。数据库将为您提供存储在对象变量中的 DateTime 值。或 null(无类型)。

DateTime 是一个结构,因此“as”运算符不适用于它。因此,只需按如下方式检查 null:

DateTime? testDate = arrayOfObjects[dateObject] == null ? (DateTime?) null : (DateTime)arrayOfObjects[dateObject];
于 2012-06-28T14:31:14.740 回答
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];
}
于 2012-06-28T14:22:00.677 回答
-1

尝试使用 Array.ConvertAll 方法。以下是它的大致实现方式:

DateTime?[] dates = Array.ConvertAll<object, DateTime?>arrayOfObjects,DateTime);  

注意:这只是一个粗略的想法。你可以更正它以适合你自己。

于 2012-06-28T14:29:42.487 回答