三元运算符语法以选择接口的实现

EluciusFTW

我想知道为什么这行代码无法编译:

ILogStuff Logger = (_logMode) ? new LogToDisc() : new LogToConsole();

请注意这两个类LogToDiscLogToConsole落实ILogStuff,以及_logMode是一个布尔变量。我收到的错误消息是:

错误3:无法确定条件表达式的类型,因为'xxx.LogToDisc'和'xxx.LogToConsole'之间没有隐式转换

但是为什么要有一个呢?我想念什么?

公平

没有可用于三元运算符的隐式转换。您需要通过三元运算符将返回的对象强制转换为ILogStuff,这在Eric Lippert的答案中很好地解释了三元条件下的隐式转换问题

ILogStuff Logger = (_logMode) ? (ILogStuff) new LogToDisc() : (ILogStuff) new LogToConsole();

根据C#语言规范的第7.13章:

?:运算符的第二和第三操作数控制条件表达式的类型。令X和Y为第二和第三操作数的类型。然后,

  • 如果X和Y是同一类型,则这是条件表达式的类型。
  • 否则,如果存在从X到Y的隐式转换(第6.1节),但不存在从Y到X的隐式转换,则Y是条件表达式的类型。
  • 否则,如果存在从Y到X的隐式转换(第6.1节),但不存在从X到Y的转换,则X是条件表达式的类型。
  • 否则,无法确定表达式类型,并且会发生编译时错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章