【问题标题】:Why can't I use a ternary operator with this expression? [duplicate]为什么我不能在这个表达式中使用三元运算符? [复制]
【发布时间】:2011-09-24 08:42:34
【问题描述】:
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);

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

【问题讨论】:

  • 这是关于 SO 的一个非常常见的问题。有关详细信息,请参阅stackoverflow.com/questions/2215745/…。另见我的相关文章blogs.msdn.com/b/ericlippert/archive/2010/05/27/…
  • @Eric 我会检查一下。谢谢!
  • 不客气。问题是您的推理与编译器推理的方向相反。您是在说“我知道这将导致需要对象的东西”。但是编译器不知道您先验希望选择“对象”方法。编译器试图以另一种方式推理。它在问“期望对象与此表达式兼容的方法吗?”要知道它必须问“表达式的类型是什么?” 问题是它无法计算出表达式的类型来决定表达式是否有效。

标签: c# ternary-operator implicit-conversion


【解决方案1】:

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

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

这应该可以代替(虽然我没有检查):

dict.Add("breakit", myDate.HasValue ? (object)myDate.Value : (object)DBNull.Value);

【讨论】:

  • 我的表达式应该是 System.DateTime 或 DBNull 类型,具体取决于 myDate.Value 的条件
  • 那么它不是静态类型,而是动态类型。 C# 编译器是静态类型的(除了一些我不太确定的 dynamic 机制)。
  • 每个表达式都必须有类型实际上不是真的,但是每个条件表达式都必须有类型是真的。 C# 中有四个没有类型的表达式。空文字、一个 lambda、一个匿名方法和一个方法组。在每种情况下,类型信息从上下文流向表达式,而不是像通常那样从表达式向外流动。
  • 感谢您的澄清,+1
【解决方案2】:

你试过了吗:

DateTime? date = myDate.HasValue ? myDate.Value : null;

dict.Add("breakit", date);

【讨论】:

  • 尽管如此,我还是不明白为什么当它是主基类时我们需要强制转换为对象!
猜你喜欢
  • 2014-11-29
  • 2017-09-06
  • 2018-03-16
  • 1970-01-01
  • 2020-10-16
  • 2015-12-09
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多