对象创建中的条件运算符

本文关键字:条件运算符 创建 对象 | 更新日期: 2023-09-27 18:31:41

我有这段代码:

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;

问题是为什么? 和索鲁斯?:)

对象创建中的条件运算符

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

尝试将其转换为可为空的日期时间 ( DateTime? ):

ValidationDate = (DateTime?)myOtherClass.ValidationDate

因为您毕竟在尝试填充可为空的日期时间字段。

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

ValidationDate = myOtherClass.ValidationDate ?? DateTime.Now

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

尝试将行更改为简单:

ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now;
如果 MyOtherClass 中的 ValidationDate 是可为空的 DateTime

,而 MyClass 中的 ValidationDate 是 DateTime(不可为空),那么您可以这样做:

ValidationDate = myOtherClass.ValidationDate?? DateTime.Now

null转换为DateTime?

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

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

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