对象创建中的条件运算符

时间:2012-04-19 09:04:58

标签: c# c#-4.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;

问题是为什么?和Solustion? :)

4 个答案:

答案 0 :(得分:3)

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

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

ValidationDate = (DateTime?)myOtherClass.ValidationDate

因为你试图填充一个可以为空的DateTime字段。

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

ValidationDate = myOtherClass.ValidationDate ?? DateTime.Now

答案 1 :(得分:0)

null投射到DateTime?

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

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

由于null本身并不对应任何类型,因此您需要强制转换该分支 - 上述方法有效,因为DateTimeDateTime?之间存在隐式转换{1}}分支。

答案 2 :(得分:0)

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

尝试将行更改为:

ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now;

答案 3 :(得分:0)

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

ValidationDate = myOtherClass.ValidationDate?? DateTime.Now