向下倾斜列表

时间:2011-03-01 11:19:57

标签: c# .net generics covariance

  

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

假设您有一个类,该类触发具有不同类集合的事件。您想要获取这些集合并实例化一个带有List&lt; object&gt;的对象。作为它的构造函数的参数(你需要IList的方法:索引访问,indexOf等)。

最佳做法是什么?

如果事件返​​回List或IList,则在从更具体的类的List创建它时必须进行一些讨厌的转换,例如List&lt; SomeClass&gt;因为IList是不变的。

new DataObject(someClasses.Cast<object>().ToList())

你可以使用Enumerable&lt; whatever&gt;在事件中,至少你可以简单地做新的DataObject(someClasses.ToList())但是仍然需要创建一个可能有一些开销的新List ......

列表无法自动对象

似乎有点奇怪

1 个答案:

答案 0 :(得分:1)

问题是您将List<object>作为参数的方法。选项:

  • 让他们采取IEnumerable<object>
  • 使用List<T>
  • 使它们成为通用的

以下是您无法将List<string>转换为List<object>的原因:

List<string> strings = new List<string>();
List<object> objects = strings;
objects.Add(new Button());
string text = strings[0];

显然,在执行时无法“正常工作”,因此最好在编译时禁止它。第1,3和4行对我来说都很好 - 所以得到是第2行导致问题,这确实是语言的设计方式。您如何建议该语言可以设计为使上述“安全”?

对于 lot 有关通用差异的更多信息,请参阅我的NDC 2010关于该主题的讨论 - 转到NDC video page并搜索“差异”。