三元运算符中的相似类型创建

时间:2018-04-13 11:25:32

标签: c#

我创建了界面:

 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);

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

您的三元运算符说:如果满足条件,则创建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);