C#无法从“继承类”转换为“基类”`

C#无法从“继承类”转换为“基类”`,c#,generics,C#,Generics,我有以下代码: 简单类 public class Transport { } public class Car : Transport { } public class Bus : Transport { } public class Wrapper<T> where T : Transport { public T Vehicle { get; set; } public void Brake() { } public void Accelerate()

我有以下代码:

简单类

public class Transport { }
public class Car : Transport { }
public class Bus : Transport { }
public class Wrapper<T> where T : Transport
{
    public T Vehicle { get; set; }
    public void Brake() { }
    public void Accelerate() { }
}

public class BusWrapper : Wrapper<Bus>
{
    public void PickupPassenger() { }
}

public class CarWrapper : Wrapper<Car>
{
    public void GoRacing() { }
}
包装类

public class Transport { }
public class Car : Transport { }
public class Bus : Transport { }
public class Wrapper<T> where T : Transport
{
    public T Vehicle { get; set; }
    public void Brake() { }
    public void Accelerate() { }
}

public class BusWrapper : Wrapper<Bus>
{
    public void PickupPassenger() { }
}

public class CarWrapper : Wrapper<Car>
{
    public void GoRacing() { }
}
公共类包装器,其中T:Transport
{
公共T车辆{get;set;}
public void Brake(){}
public void(){}
}
公共类总线包装器:包装器
{
public void PickupPassenger(){}
}
公共类CarWrapper:Wrapper
{
公共无效({}
}
这是我正在尝试的,它给了我编译错误:

List<Wrapper<Transport>> list = new List<Wrapper<Transport>>();

list.Add(new CarWrapper());
list.Add(new BusWrapper());

list.ForEach(wrapper =>
{
    wrapper.Accelerate();
    if (wrapper is CarWrapper)
        ((CarWrapper)wrapper).GoRacing();
    else if (wrapper is BusWrapper)
        ((BusWrapper)wrapper).PickupPassenger();

    wrapper.Brake();
});
List List=新列表();
添加(新的CarWrapper());
添加(新的BusWrapper());
list.ForEach(包装器=>
{
包装器。加速();
if(包装器是CarWrapper)
((CarWrapper)wrapper.GoRacing();
else if(包装器为总线包装器)
((总线包装器)wrapper.PickupPassenger();
包装器。制动器();
});
错误

cannot convert from 'CarWrapper' to 'Wrapper<Transport>'
cannot convert from 'BusWrapper' to 'Wrapper<Transport>'
无法从“CarWrapper”转换为“Wrapper”
无法从“BusWrapper”转换为“Wrapper”
问题

我在这里做错了什么,我在这里试图实现的任何解决方法


提前感谢。

您错误地认为,如果
汽车继承自
运输
,那么
包装
也继承自
包装
。事实并非如此


您需要定义
iwraper
,并将其用于列表。然后这种协变就可以起作用。

你在尝试协变。在这种情况下,你最好使用一个界面。当你问问题时,你应该首先检查StackOverflow识别的类似问题。除了前面评论中几乎相同的问题(这甚至是传输领域中的另一个问题),您可能已经发现了和。除了他的
IWrapper
接口实际上不是协变的,因此
IWrapper
将导致编译错误。感谢您指出了正确的方向,我正在阅读,几乎得到了我想要的need@BenVoigt-
T
类型只显示出来。你能进一步解释一下吗?在我看来,这两种情况都很相似:
public T Vehicle{get;set;}