列表的通用列表<t> </t>

时间:2011-09-14 10:27:31

标签: c# list generics

  

可能重复:
  In C#, why can't a List<string> object be stored in a List<object> variable

我认为这可行:

private List<DateTime> _dateTimes = new List<DateTime>();
private List<String> _strings = new List<String>();

private List<List<Object>> _listOfLists = new List<List<Object>>();

_listOfLists.Add(_dateTimes);
_listOfLists.Add(_strings);

但是,我收到一个编译错误,指出.Add方法有一些无效的参数......有人看到了原因吗?而且,有一个通用的列表列表可以解决什么问题?

2 个答案:

答案 0 :(得分:5)

问题是,出于与类型安全相关的原因,您无法将List<string>视为List<object>。如果可以的话,这是可能的:

var list = (List<object>)(new List<string>());
list.Add((object)42); // this should never be allowed to compile

可以做的是:

private List<DateTime> _dateTimes = new List<DateTime>();
private List<String> _strings = new List<String>();

private List<IList> _listOfLists = new List<IList>();

_listOfLists.Add(_dateTimes);
_listOfLists.Add(_strings);

这可行,因为List<T>实现了IList。当然,您现在已经通过丧失编译时类型安全性来“强制”编译代码。从本质上讲,您接受如果您尝试向其中一个IList实例添加不正确类型的对象,您将获得运行时异常。

答案 1 :(得分:0)

List<string>不是List<object>。如果是这种情况,您可以在运行时将List<string>强制转换为List<object>,然后使用Add以外的类型调用string方法。这会破坏列表的状态。