【问题标题】:Conditional operator assignment [duplicate]条件运算符赋值
【发布时间】:2018-06-09 06:31:33
【问题描述】:

如果我可以将任何子类型分配给超类型引用(向上转换):

IWService wService;
wService = new WService();
wService = new WServiceStub();

为什么我不能在条件运算符? : 中分配它们?

IWService wService = isStub ? new WServiceStub() : new WService();

我收到此错误:

无法确定条件表达式的类型,因为存在 MyNamespace.WServiceStub 和 MyNamespace.WService 之间没有隐式转换

但是将其中一个转换为超类型来编译就足够了:

IWService wService = isStub ? (IWService)new WServiceStub() : new WService();

IWService wService = isStub ? new WServiceStub() : (IWService)new WService();

如果我永远不会得到InvalidCastException,我不明白为什么我需要一个明确的演员表。转换总是确定的,不是吗?

下面的代码是不是一模一样?

IWService wService;
if (isStub)
{
    wService = new WServiceStub();
}
else
{
    wService = new WService();
}

【问题讨论】:

  • 如果 WService 和 WServiceStub 都实现了 IDisposable 以及 IWService,那么表达式 isStub ? new WServiceStub() : new WService() 应该具有哪种类型?

标签: c# casting conditional-operator


【解决方案1】:

这是因为第三个操作数的类型必须可以转换为第二个操作数的类型,所以在判断表达式的结果类型时不看赋值左侧。

【讨论】:

猜你喜欢
  • 2011-09-18
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2010-11-21
  • 1970-01-01
  • 2017-07-16
  • 2018-07-04
相关资源
最近更新 更多