C# 无法从 `Inherited Class` 转换为 `Base Class`

标签 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 BusWrapper : Wrapper<Bus>
{
    public void PickupPassenger() { }
}

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

这就是我正在尝试的,这给了我编译错误:

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

错误

cannot convert from 'CarWrapper' to 'Wrapper<Transport>'
cannot convert from 'BusWrapper' to 'Wrapper<Transport>'

问题

我在这里做错了什么,我想在这里实现什么解决方法。

提前致谢。

最佳答案

您错误地假设如果 Car继承自Transport然后Wrapper<Car>也继承自Wrapper<Transport> 。事实并非如此。

您需要定义IWrapper<out T>并将其用于您的列表。那么这种协方差就可以发挥作用。

关于C# 无法从 `Inherited Class` 转换为 `Base Class`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12719564/

相关文章:

c# - DateTime 自定义格式不符合预期

c# - 在 Linq c# 中安全取消引用 FirstOrDefault 调用

c# - 使用 MySQL 的 EF5 Code First GUID

typescript - 如何根据可选参数的类型确定返回类型

c# - 比较实体

java - 令人困惑的 Java 泛型用法 : how do I properly parameterize this?

Java 泛型和枚举,模板参数丢失

c# - wpf 绑定(bind) Material 设计对话框宽度小于或超过窗口宽度

java - 构造泛型对象时,可以从变量传递其类型吗?

c# - 在循环中按下另一个应用程序中的按钮