我正在解决运输问题,无法跨越这个障碍。我无法将派生类 StopsVisited 转换为其基类停止。基类Stops是Stop的集合。派生类StopsVisited是StopVisited的集合。
StopVisited元素派生自Stop(定义未显示)。
我有一个非泛型的解决方法,我简单地从Stops派生StopsVisited,但是泛型为我提供了更多的felixibility。我试图将它简化为最简单的形式。
基地
public abstract class Stops<T> where T : Stop
{
}
派生
public class StopsVisited : Stops<StopVisited>
{
}
问题:
Stops<Stop> stops = new StopsVisited();
给我一个
错误1无法将类型'StopsHeirarchy.StopsVisited'隐式转换为'StopsHeirarchy.Stops'
感谢任何帮助。
答案 0 :(得分:5)
StopsVisited
不是Stops<Stop>
的子类型;它是Stops<StopVisited>
的子类型,这是完全不同的东西。我同意duffymo的说法,即子类型错误是解决问题的方法,但您要问的具体功能在C#4中被称为“协方差”或“输出安全”;你可以阅读here。
答案 1 :(得分:3)
就个人而言,我不会使用继承来说已经访问过Stop。我有一个布尔数据成员说已经访问过Stop。它似乎是一个二元属性 - 你已经被访问过,或者你没有被访问过。
继承应该是关于不同的行为。除非你可以说访问的Stop在某种程度上表现不同,否则我会建议不要使用此设计中的继承。
答案 2 :(得分:0)
C#4.0通过修改CLR来支持它来解决这个问题。
在此期间,有一个IStops接口(非泛型)并转换为它。