【问题标题】:Generic List of List<T> [duplicate]List<T> 的通用列表 [重复]
【发布时间】:2011-09-14 10:27:30
【问题描述】:

可能重复:
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 方法有一些无效参数...有人知道为什么吗?而且,拥有通用列表列表的解决方案是什么?

【问题讨论】:

  • 以及对 .Add 的两次调用中的哪一个会出现错误? :D

标签: c# list generics


【解决方案1】:

问题在于,出于与类型安全相关的原因,您不能将List&lt;string&gt; 视为List&lt;object&gt;。如果可以,这将是可能的:

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&lt;T&gt; 实现了 IList。当然,您现在已经通过放弃编译时类型安全来“强制”编译代码。本质上,您接受如果您尝试将不正确类型的对象添加到 IList 实例之一,您将获得运行时异常。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2018-02-13
      • 2010-09-30
      相关资源
      最近更新 更多