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节)。如果你不能删除,让我知道,我可以标记为重复。