C# 强制转换可能为null的对象

C# 强制转换可能为null的对象,c#,datetime,casting,null,C#,Datetime,Casting,Null,那代码看起来正常吗?我试图将用作运算符,但出现了“不可为空”错误。我想说的是,我从数组中选择的对象要么是DateTime,要么是null DateTime,但都可以分配给testDate 这样做感觉不对,我想我遗漏了一些明显的东西 编辑:我想这与我将改编为的方式相同,如下所示: DateTime? testDate = (DateTime?)arrayOfObjects[dateObject]; 这两行代码都是处理潜在空值的最佳方法吗?更好的方法是执行以下操作: DateTime? testD

那代码看起来正常吗?我试图将
用作
运算符,但出现了“不可为空”错误。我想说的是,我从数组中选择的对象要么是
DateTime
,要么是
null DateTime
,但都可以分配给testDate

这样做感觉不对,我想我遗漏了一些明显的东西

编辑:我想这与我将
改编为
的方式相同,如下所示:

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

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

更好的方法是执行以下操作:

DateTime? testDate = arrayOfObjects[dateObject] as DateTime?;
if(arrayOfObjects[dateObject] != null && arrayOfObjects[dateObject] is DateTime)
{
  DateTime testDate = (DateTime)arrayOfObjects[dateObject];
  // logic here
}
或者类似于:

DateTime? testDate = arrayOfObjects[dateObject] as DateTime?;
if(arrayOfObjects[dateObject] != null && arrayOfObjects[dateObject] is DateTime)
{
  DateTime testDate = (DateTime)arrayOfObjects[dateObject];
  // logic here
}
DateTime?testDate=null;
如果(arrayOfObjects[dateObject]是DateTime)
{
testDate=(DateTime)arrayOfObjects[dateObject];
} 
如果(arrayOfObjects[dateObject]可为空,则为else)
{
testDate=(可为空)arrayOfObjects[dateObject];
}
这两行代码都是处理潜在空值的最佳方式吗

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

关于基本问题:

我是否遗漏了什么,或者这是典型的(或者至少是可以接受的)方法

这是可以接受的,但可能有点模糊,因为它“隐藏”了取消装箱操作。
您可以使用:

DateTime? testDate = null;
if(arrayOfObjects[dateObject] is DateTime)
{
    testDate = (DateTime)arrayOfObjects[dateObject];
} 
else if (arrayOfObjects[dateObject] is Nullable<DateTime>) 
{
    testDate = (Nullable<DateTime>)arrayOfObjects[dateObject];
}
但这太冗长了。这个特殊的问题不适合条件运算符(
?:


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

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

DateTime? testDate = null;
if (arrayOfObjects[dateObject] != null)  
   testDate = (DateTime) arrayOfObjects[dateObject];  // no '?'
DateTime?[]日期=Array.ConvertAllarrayOfObjects,DateTime);

注意:这只是一个粗略的想法。你可以根据自己的情况修改它。

日期时间?是另一个结构的较短形式

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

添加填充arrayOfObjects的代码…这是SQL查询的结果。这是一个ResultableCollection。如果您可以使用调试器,那么您可以在填充查询结果或添加typeoff调用后看到中断时使用的类型。您使用的是哪种DB驱动程序>
DateTime?
也是一种值类型。非常感谢。其实问题并不在于强制转换失败,我不认为有必要测试null,因为testDate将接受null+1.澄清-我的问题是-我是否遗漏了什么,或者这是将此类对象分配给可为null的DateTime变量的典型(或至少是可接受的)方法?@DanielMcNulty nullable或DateTime?DateTime和DateTime是不同的类型。