C# 三元运算符(?)不工作

C# 三元运算符(?)不工作,c#,if-statement,ternary-operator,C#,If Statement,Ternary Operator,为什么这样不行 DateTime? date = condition?DateTime.Now: null; //Error: no implicit conversion between DateTime and null 而这个呢 DateTime? date; if (condition) { date = DateTime.Now; } else date = null; 我们可以发现一个类似的问题,但我就是不能把它联系起来。谢谢你的帮助 更新:我读了Jon Skeet推荐的

为什么这样不行

DateTime? date = condition?DateTime.Now: null; //Error: no implicit conversion between DateTime and null
而这个呢

DateTime? date;
if (condition)
{
  date = DateTime.Now;
}
else
  date = null;
我们可以发现一个类似的问题,但我就是不能把它联系起来。谢谢你的帮助

更新:我读了Jon Skeet推荐的,上面写着:

If one of the second and third operands is of the null type and the type of the other is a 
reference type, then the type of the conditional expression is that reference type
所以,当使用三元运算符时,转换是强制的,即使我已经指定了变量类型

为什么这样不行

DateTime? date = condition?DateTime.Now: null; //Error: no implicit conversion between DateTime and null
为了回答这个问题,我将引用错误消息:

DateTime和null之间没有隐式转换

DateTime。现在
是类型
null
不是有效的
DateTime
值。编译器说它找不到
DateTime.Now
null
都可以隐式转换为的公共类型(因为您没有显式指定任何转换)

但是,对于C#中的三元
?:
运算符,必须将第二个和第三个操作数转换为同一类型,这也是涉及
?:
的整个表达式返回值的类型

显然,您希望检索
DateTime?
值-
DateTime
值不会隐式转换为
DateTime?
,但您可以显式执行此操作:

DateTime? date = condition ? (DateTime?)DateTime.Now : null;

这种方式,你告诉编译器把第二个操作数看作是<代码>日期时间> <代码>。第三个操作数

null
,可以隐式转换为
DateTime?
,因此不再存在矛盾,因此编译器错误消失

为什么这样不行

DateTime? date = condition?DateTime.Now: null; //Error: no implicit conversion between DateTime and null
为了回答这个问题,我将引用错误消息:

DateTime和null之间没有隐式转换

DateTime。现在
是类型
null
不是有效的
DateTime
值。编译器说它找不到
DateTime.Now
null
都可以隐式转换为的公共类型(因为您没有显式指定任何转换)

但是,对于C#中的三元
?:
运算符,必须将第二个和第三个操作数转换为同一类型,这也是涉及
?:
的整个表达式返回值的类型

显然,您希望检索
DateTime?
值-
DateTime
值不会隐式转换为
DateTime?
,但您可以显式执行此操作:

DateTime? date = condition ? (DateTime?)DateTime.Now : null;

这种方式,你告诉编译器把第二个操作数看作是<代码>日期时间> <代码>。第三个操作数

null
可以隐式转换为
DateTime?
,因此不再存在矛盾,因此编译器错误消失。

这不起作用,因为表达式
条件?DateTime.Now:null
无法计算,因为它的类型不清楚。表达式必须在赋值之前求值,问题不在于赋值;它与表达式的求值有关。这就是为什么if然后起作用而三元运算符不起作用的原因。

这不起作用,因为表达式
条件?DateTime.Now:null
无法计算,因为它的类型不清楚。表达式必须在赋值之前求值,问题不在于赋值;它与表达式的求值有关。这就是为什么if-then可以工作,而三元运算符不能工作。

我想把它作为一个副本关闭。请参阅或。您的“类似问题”是针对java的。虽然这两种语言表面上很相似,但这并不是真的相关。你想要的不是java规范。mike z,我知道你是对的。。在这里应该做什么?我应该删除这个问题吗?如果其他人已经回答了你的问题,那么删除就可以了。如果没有回答,请修改它,说出您不理解的内容(您可能希望查看C#spec第7.14节)。如果您无法删除,请告诉我,我可以将其标记为重复。我很想将其作为重复关闭。请参阅或。您的“类似问题”是针对java的。虽然这两种语言表面上很相似,但这并不是真的相关。你想要的不是java规范。mike z,我知道你是对的。。在这里应该做什么?我应该删除这个问题吗?如果其他人已经回答了你的问题,那么删除就可以了。如果没有回答,请修改它,说出您不理解的内容(您可能希望查看C#spec第7.14节)。如果你不能删除,让我知道,我可以标记为重复。