【问题标题】:Conditional operator with covariance [duplicate]具有协方差的条件运算符
【发布时间】:2016-01-08 09:35:43
【问题描述】:

此代码无法编译。我期望它是错误的吗?

interface I{};
class A : I{};
class B : I{};
I mything = someBoolCondition ? new A : new B;

问题是编译器说它无法确定条件运算符的返回类型。

【问题讨论】:

标签: c# covariance conditional-operator


【解决方案1】:

编译器只会考虑 2 个操作数的类型以及它们之间的隐式转换。它不会寻找基本类型或实现的接口。

您需要将其中一个操作数显式转换为 I

来自C# language specification

?: 运算符的第二个和第三个操作数 x 和 y 控制条件表达式的类型。

• 如果 x 的类型为 X,而 y 的类型为 Y,那么

o 如果存在从 X 到 Y,但不存在从 Y 到 X 的隐式转换(第 6.1 节),则 Y 是条件表达式的类型。

o 如果存在从 Y 到 X,但不存在从 X 到 Y 的隐式转换(第 6.1 节),则 X 是条件表达式的类型。

o 否则,无法确定表达式类型,并出现编译时错误。

如果编译器也检查了基类型,则任何类型的组合都是有效的 - 在最坏的情况下,结果类型将是 object

【讨论】:

    【解决方案2】:

    您需要将其中一个操作数转换为I。像这样:

    I mything = someBoolCondition  ?  (I) new A() : new B();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 2015-02-19
      • 1970-01-01
      • 2015-06-08
      • 2021-04-09
      • 2020-01-19
      相关资源
      最近更新 更多