我有这段代码:
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? :)
答案 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
本身并不对应任何类型,因此您需要强制转换该分支 - 上述方法有效,因为DateTime
和DateTime?
之间存在隐式转换{1}}分支。
答案 2 :(得分:0)
空合并运算符实际上是??
,它不会出现在代码中的任何位置 - 您使用的是三元运算符。我认为为了使其起作用,两种可能的结果(在这种情况下null
和DateTime.Now
)需要转换为相同的类型(它们不是)。
尝试将行更改为:
ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now;
答案 3 :(得分:0)
如果MyOtherClass中的ValidationDate是可以为空的DateTime,而MyClass中的ValidationDate是DateTime(不可为空),那么你可以这样做:
ValidationDate = myOtherClass.ValidationDate?? DateTime.Now