【问题标题】:Inhered types creation in ternary operator [duplicate]三元运算符中的继承类型创建
【发布时间】:2018-04-13 11:25:31
【问题描述】:

我已经创建了界面:

 public interface ILocationDetector
    {
        bool IsChanged { get; }

        void Detect(IEnumerable<LocationDto> locations);
    }

以及实现接口的抽象类

 public abstract class LocationDetector : ILocationDetector
    {
        public bool IsChanged { get; }
        //some other props..

        protected LocationDetector(MonitoredLocation monitoredLocation)
        {

        }

        public abstract void Detect(IEnumerable<LocationDto> locations);

        //some more methods...
}

我创建了两个从上面派生的类。 我想创建一个符合我的条件的实例。我要做的是:

> ILocationDetector detector = _locationOrigin == LocationOrigin.Native
>                     ? new ADetector(monitored)
>                     : new BDetector(monitored);

这给了我一个错误:

无法确定条件表达式的类型,因为存在 第一个和第二个之间没有隐式转换

但是上面的代码可以工作:

ILocationDetector a = new ADetector(monitored);
ILocationDetector b = new BDetector(monitored);

谁能解释一下?

【问题讨论】:

  • 它的简单枚举

标签: c#


【解决方案1】:

您的三元运算符说:如果满足条件,则创建ADectector 否则创建BDetector,而无需说明您要使用的基本类型/接口。这两种类型之间没有隐式转换。

编译器无法确定什么是正确的表达式类型,所以你必须通过封装告诉它什么是正确的类型。

ILocationDetector detector = _locationOrigin == LocationOrigin.Native
    ? (ILocationDetector)new ADetector(monitored)
    : (ILocationDetector)new BDetector(monitored);

另外,没有必要对两个部分都进行大小写(推断第二部分),所以这样做:

ILocationDetector detector = _locationOrigin == LocationOrigin.Native
    ? (ILocationDetector)new ADetector(monitored)
    : new BDetector(monitored);

【讨论】:

  • 两个部分都不需要铸造,一个就可以了。
  • @DavidG 我已经更新了我的答案,谢谢!
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 2017-08-24
相关资源
最近更新 更多