0

我有这个代码:

private MyClass CreateObject(MyOtherClass myOtherClass)
{
    return new MyClass
    {
        Name = myOtherClass.Name,
        ValidationDate = (DateTime)myOtherClass.ValidationDate  //ValidationDate is nullable
    };
}

如果我这样做,我有一个编译错误:

无法确定条件表达式的类型,因为'<null>'和之间没有隐式转换'System.DateTime'

private MyClass CreateObject(MyOtherClass myOtherClass)
{
    return new MyClass
    {
        Name = myOtherClass.Name,
        ValidationDate = (myOtherClass.VALIDATION_DATE == null) ? null : DateTime.Now  //ValidationDate is nullable
    };
}

如果我这样做,没问题:

MyClass myClass = new MyClass();
if (myClass.ValidationDate == null)
    myClass.ValidationDate = null;

问题是为什么?和解决方案?:)

4

4 回答 4

3

第一个代码块中的问题是您试图将一个可为空的 DateTime 值转换为 DateTime。

尝试将其转换为可为空的 DateTime ( DateTime?) :

ValidationDate = (DateTime?)myOtherClass.ValidationDate

因为您毕竟试图填充一个可为空的 DateTime 字段。

如果您尝试在myOtherClass.ValidationDate为 null 的情况下提供默认值,请使用合并运算符(无需强制转换):

ValidationDate = myOtherClass.ValidationDate ?? DateTime.Now
于 2012-04-19T09:06:51.577 回答
0

投射null到 a DateTime?

ValidationDate = (myOtherClass.VALIDATION_DATE == null) ? 
                                                  (DateTime?)null : DateTime.Now;

条件运算符要求两个结果分支具有相同的类型或可以隐式转换的类型。

由于null其本身不对应于任何类型,因此您需要强制转换该分支 - 上述工作是因为分支之间存在隐式DateTime转换。DateTime?DateTime.Now

于 2012-04-19T09:07:55.437 回答
0

空合并运算符实际上??不会出现在您的代码中的任何位置 - 您使用的是三元运算符。我相信为了使它起作用,两个可能的结果(在这种情况下nullDateTime.Now)需要可转换为相同的类型(它们不是)。

尝试将行更改为简单的:

ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now;
于 2012-04-19T09:09:17.263 回答
0

如果 MyOtherClass 中的 ValidationDate 是可为空的 DateTime,并且 MyClass 中的 ValidationDate 是 DateTime(不可为空),那么您可以这样做:

ValidationDate = myOtherClass.ValidationDate?? DateTime.Now
于 2012-04-19T09:09:30.497 回答