3

如何将类型的泛型列表设置为其接口的泛型列表?

我有一个Car继承自ICar.

我有一个在构造函数Client中接受List<ICar>对象的类,我不想List<Car>Client该类显式编写。

但是无法设置

var carsList = new List<Car>();
List<ICar> cars = carsList // compile error
var client = new Client(cars);

您将如何实现这一目标?

我意识到如果我把它做成 IList 它会起作用,但我必须明确地转换我的 carsList 对象。

4

5 回答 5

2

您将无法使用 .NET Framework 列表并执行所需的隐式转换类型。

我将从另一个线程中窃取一些东西来演示基本问题:

考虑:

List<Animal> animals = new List<Giraffe>();
animals.Add(new Monkey());

或使用您的代码:

interface ICar{}
class Car:ICar{}
class BatMobile:ICar{}

List<ICar> cars = new List<Car>()
cars.Add(new BatMobile()) // We can't add a BatMobile to a List of Car. 

IEnumerable 可以处理这种类型的差异,因为您确保用户无法通过 IEnumerable 接口修改集合。使用列表无法保证这一点。

https://stackoverflow.com/a/2033931/299408

于 2013-01-03T17:22:10.530 回答
1

您不能直接将 aList<Car>转换为 a List<ICar>,因为您可以尝试将 a 添加OtherCarList<ICar>隐藏的 aList<Car>中,但这是行不通的。

相反,您可以:

  • 使构造函数参数成为协变接口,例如 an IEnumerable<Car>,并在构造函数内部从它创建一个列表,或者
  • 通过在构造函数之外转换列表List<ICar> cars = carsList.ToList<ICar>();
于 2013-01-03T17:11:44.370 回答
1

存在三种方式:

1) define carsList as List<ICar>
2) use framework 4.0 and IEnumerable<ICar>
3) manually convert
于 2013-01-03T17:11:54.497 回答
0

将列表定义为 ICar 列表...

var carsList = new List<ICar>();
List<ICar> cars = carsList; // compile error gone :)
于 2013-01-03T17:09:20.383 回答
0

你必须反过来做。

var carsList = new List<ICar>(); // Hey, why not?
var client = new Client(cars);

你试过铸造吗?

List<ICar> carsList = (List<ICar>)implementationList;
于 2013-01-03T17:11:16.847 回答