为什么我不能使用这个表达式的三元运算符?

sco*_*ttm 5 c# ternary-operator implicit-conversion

var dict = new Dictionary<string, object>();
DateTime? myDate;

/*Next line gives: Type of conditional expression cannot be 
determined because there is no implicit conversion between 'System.DateTime?' 
and 'System.DBNull' */

dict.Add("breakit", myDate.HasValue ? myDate.Value : DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么如果一个或另一个进入期望类型为Object的字典,则需要进行隐式转换.

Zru*_*uty 6

在C#中,每个条件表达式都必须具有类型.你的表达是什么类型的?

我理解您的担忧,您的特定情况不需要转换,但这是C#编译器的工作方式,因此您必须遵守其规则.

这应该工作(我没有检查):

dict.Add("breakit", myDate.HasValue ? (object)myDate.Value : (object)DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

  • 实际上,*every*表达式必须具有类型,但每个*条件表达式*必须具有类型才是真的.C#中有四个没有类型的表达式.null文字,lambda,匿名方法和方法组.在每种情况下,类型信息从上下文流向表达式*而不是像往常一样从表达式向外流动. (7认同)