转换可能为null的对象

时间:2012-06-28 14:16:16

标签: c# datetime casting null

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

那段代码看起来不错吗?我试图使用as运算符,但我得到了'不可为空'的错误。我想说的是我从数组中选择的对象是DateTimenull DateTime,但可以将其分配给testDate。

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

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

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

这两行代码是处理潜在空值的最佳方法吗?

4 个答案:

答案 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);  

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