无法将派生类转换为基类

时间:2009-12-23 21:53:44

标签: c# .net

我正在解决运输问题,无法跨越这个障碍。我无法将派生类 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'

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

StopsVisited不是Stops<Stop>的子类型;它是Stops<StopVisited>的子类型,这是完全不同的东西。我同意duffymo的说法,即子类型错误是解决问题的方法,但您要问的具体功能在C#4中被称为“协方差”或“输出安全”;你可以阅读here

答案 1 :(得分:3)

就个人而言,我不会使用继承来说已经访问过Stop。我有一个布尔数据成员说已经访问过Stop。它似乎是一个二元属性 - 你已经被访问过,或者你没有被访问过。

继承应该是关于不同的行为。除非你可以说访问的Stop在某种程度上表现不同,否则我会建议不要使用此设计中的继承。

答案 2 :(得分:0)

C#4.0通过修改CLR来支持它来解决这个问题。

在此期间,有一个IStops接口(非泛型)并转换为它。