对象创建中的条件运算符
本文关键字:条件运算符 创建 对象 | 更新日期: 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
空合并运算符实际上是??
它不会出现在代码中的任何位置 - 您使用的是三元运算符。我相信为了做到这一点,两种可能的结果(在本例中为 null
和 DateTime.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
分支的DateTime
和DateTime?
之间存在隐式转换。