我创建了界面:
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);
有人可以解释一下吗?
答案 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);