C# 对象创建中的条件运算符
我有以下代码:C# 对象创建中的条件运算符,c#,c#-4.0,C#,C# 4.0,我有以下代码: private MyClass CreateObject(MyOtherClass myOtherClass) { return new MyClass { Name = myOtherClass.Name, ValidationDate = (DateTime)myOtherClass.ValidationDate //ValidationDate is nullable }; } 如果执行此操作,则会出现编译错误:
private MyClass CreateObject(MyOtherClass myOtherClass)
{
return new MyClass
{
Name = myOtherClass.Name,
ValidationDate = (DateTime)myOtherClass.ValidationDate //ValidationDate is nullable
};
}
如果执行此操作,则会出现编译错误:
无法确定条件表达式的类型,因为存在
在'
和'System.DateTime'
如果我这样做,没问题:
MyClass myClass = new MyClass();
if (myClass.ValidationDate == null)
myClass.ValidationDate = null;
问题是为什么?还有索利斯顿?:) 第一个代码块中的问题是,您试图将一个可为空的DateTime值强制转换为DateTime 请尝试将其强制转换为可为空的日期时间(
DateTime?
):
因为您毕竟试图填充一个可为空的DateTime字段
如果试图在myOtherClass.ValidationDate
为null的情况下提供默认值,请使用合并运算符(无需强制转换):
第一个代码块中的问题是,您试图将一个可为null的DateTime值强制转换为DateTime 请尝试将其强制转换为可为空的日期时间(
DateTime?
):
因为您毕竟试图填充一个可为空的DateTime字段
如果试图在myOtherClass.ValidationDate
为null的情况下提供默认值,请使用合并运算符(无需强制转换):
将
null
强制转换为DateTime?
:
ValidationDate = (myOtherClass.VALIDATION_DATE == null) ?
(DateTime?)null : DateTime.Now;
条件运算符要求两个结果分支具有相同的类型或可以隐式转换的类型
由于
null
本身并不对应于任何类型,因此您需要强制转换该分支-上述操作有效,因为DateTime
和DateTime?
之间存在DateTime.Now
分支的隐式转换。将null
强制转换为DateTime?
:
ValidationDate = (myOtherClass.VALIDATION_DATE == null) ?
(DateTime?)null : DateTime.Now;
条件运算符要求两个结果分支具有相同的类型或可以隐式转换的类型
由于
null
本身并不对应于任何类型,您需要强制转换该分支-上述操作有效,因为对于DateTime.Now
分支,在DateTime
和DateTime?
之间存在隐式转换。空合并运算符实际上是?
,它在代码中的任何地方都不会出现-您使用的是三元运算符。我认为,为了使其发挥作用,两种可能的结果(在本例中为null
和DateTime.Now
)需要转换为相同的类型(它们不是)
尝试将行更改为:
ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now;
空合并运算符实际上是
?
,它不会出现在代码中的任何地方-您使用的是三元运算符。我认为,为了使其发挥作用,两种可能的结果(在本例中为null
和DateTime.Now
)需要转换为相同的类型(它们不是)
尝试将行更改为:
ValidationDate = myOtherClass.VALIDATION_DATE ?? DateTime.Now;
如果MyOtherClass中的ValidationDate是可为null的DateTime,而MyClass中的ValidationDate是DateTime(不可为null),则可以执行以下操作:
ValidationDate = myOtherClass.ValidationDate?? DateTime.Now
如果MyOtherClass中的ValidationDate是可为null的DateTime,而MyClass中的ValidationDate是DateTime(不可为null),则可以执行以下操作:
ValidationDate = myOtherClass.ValidationDate?? DateTime.Now
MyClass.ValidationDate
和MyOtherClass.ValidationDate
的类型是什么?当你说“如果我这样做,没问题”。我不同意,你在那里什么也不做。您正在将null设置为一个已经为null的值。Nitpic-null合并运算符是?
。你说的是条件运算符?:
@Oded我在回答你的问题1分钟后指出了这一点+1用于编辑标题。@Bridge-编辑被锁定,直到批准/拒绝。如果您建议编辑,并且有足够代表性的人“改进”了它,他们可以将您的建议标记为有帮助。MyClass.ValidationDate
和MyOtherClass.ValidationDate
的类型是什么?当您说“如果我这样做,没有问题”。我不同意,你在那里什么也不做。您正在将null设置为一个已经为null的值。Nitpic-null合并运算符是?
。你说的是条件运算符?:
@Oded我在回答你的问题1分钟后指出了这一点+1用于编辑标题。@Bridge-编辑被锁定,直到批准/拒绝。如果您建议编辑,并且有足够代表性的人“改进”了编辑,他们可以将您的建议标记为有用。这两个字段都是DateTime?
。这对有问题的条件语句有何帮助?@Oded感谢您指出这一点;我没有看到DateTime。现在
在第二个代码块中,两个字段都是DateTime?
。这对有问题的条件语句有何帮助?@Oded感谢您指出这一点;我没有看到DateTime。现在,在第二个代码块中,正如w0lf所指出的,通过强制转换为null DateTime使它们成为相同的类型。或者正如w0lf所指出的,通过强制转换为null DateTime使它们成为相同的类型。