我为什么要在List <T>上返回IList <T>?

Dan*_*eny 15 .net c# generics interface

可能重复:
C# - List <T>或IList <T>

它写的是你应该IList<T>从你的方法返回而不是,List<T>但我找不到任何真正好的理由.我一直在寻找执行此操作的代码,然后调用代码通常执行以下两项操作之一:

  1. 调用new List<T>(returnedIList)它可以使用List上的所有好方法
  2. 强制转换为List<T>可以使用List上的所有好方法

第一个是笨重的,第二个是抛出(运行时), InvalidCastException如果实现实际上已经改变为其他东西(这使得它完全是愚蠢的).

如果我使用List<T>并且由于某种原因必须将其替换为IList<T>我无法继承的实现,List<T>那么我将得到构建错误并且必须更改一些代码.这可能是非常不可能的,如果发生这种情况,修复工作并不是很多.当然,不值得失去List<T>和/或不得不投射/新List<T>(存在,查找等)的好处,以便让他们回到这种不太可能的情况?

那么,还有其他原因可以归还IList<T>吗?

Jus*_*ner 10

听起来像你在看一些质量差的代码.

返回IList<T>而不是List<T>允许您的代码更灵活.您可以将实现替换为任何实现的集合,IList<T>而不会破坏任何调用代码.这是一件好事...但只有当定义的功能IList<T>符合您的需求时才会这样.

您可以概括地说,您应该始终返回最通用的类​​型.在大多数情况下,你可以逃脱,IEnumerable<T>但如果你需要更多的功能,那么IList<T>工作.如果没有削减它,返回具体类型并完成它.

在你提到的两种情况中,都需要使用不直接提供的东西IList<T>(如果没有,那么这两种方法都是错误的).在这些情况下,该方法应该返回List<T>以提供所需的功能,或者调用者应该使用另一种方法.


Jam*_*rgy 2

原因是您的方法可以与任何实现 的方法一起使用IList<T>,而不仅仅是 List。然而,情况变得更糟,自从 Linq 出现以来,我开始返回很多东西Enumerable<T>,甚至只是返回IEnumerable

不过,我不确定我是否理解其中的困难。如果某个东西返回一个实际的列表,并且它的返回取决于该列表,或者它的使用特定于该列表,那么它应该返回List<T>。如果没有,那么您应该不需要将其转换为列表。