.net 为什么resharper会说:“我不知道。”;返回类型可以是IEnumerable<;T>&引用;?

.net 为什么resharper会说:“我不知道。”;返回类型可以是IEnumerable<;T>&引用;?,.net,generics,collections,resharper,.net,Generics,Collections,Resharper,我是新来的重弹手,喜欢它。然而,它最近提出了一些对我来说没有意义的建议,我想知道它为什么提出这个建议。我已经在Resharper中禁用了它,但我想知道是否有什么我遗漏了 我编写了一个带有签名的函数:List DoSomething() Resharper建议我将其更改为:IEnumerable DoSomething() 现在我可以理解为什么方法的参数必须尽可能通用。它有助于代码的可重用性等。但是,我尝试确保我的方法返回的数据是特定的,而不是泛型的 有人能解释一下为什么Resharper会建议它

我是新来的重弹手,喜欢它。然而,它最近提出了一些对我来说没有意义的建议,我想知道它为什么提出这个建议。我已经在Resharper中禁用了它,但我想知道是否有什么我遗漏了

我编写了一个带有签名的函数:
List DoSomething()

Resharper建议我将其更改为:
IEnumerable DoSomething()

现在我可以理解为什么方法的参数必须尽可能通用。它有助于代码的可重用性等。但是,我尝试确保我的方法返回的数据是特定的,而不是泛型的

有人能解释一下为什么Resharper会建议它做什么吗


(要查找规则,请转到Resharper Options\Code Inspection\Inspection Severity,并搜索:“返回类型可以是IEnumerable”。

您可能希望使用更通用的返回类型,原因有很多

更通用的类型允许您更自由地更改方法的实现,而无需更改方法接口。例如,如果返回类型为
IEnumerable
,您可以选择使用
字符串[]
而不是
列表来生成返回值

使用更通用的类型可以为数据提供一些保护。如果该方法返回的列表作为类中的私有成员存在,则调用该方法的人可以更改返回的列表,而不会意识到它更改了类中的列表。当您返回一个只能用于迭代项目的
IEnumerable
时,它不允许您更改列表


更清楚的是,应该如何使用更有限的返回类型。假设
IEnumerable
应该被迭代,这是很自然的,但是
列表可以以许多不同的方式使用。

我建议您看看这个答案:谢谢!我试着在谷歌上搜索“返回类型可以是IEnumerable”,但由于某种原因,这个答案并没有出现。另一个页面“Resharper建议参数可以是'BaseType'类型”确实出现在我的谷歌搜索中,但这不是我想要的。我同意对于接口,IEnumerable更有意义(因为不同的实现可能使用不同的IEnumerable实现(如列表或数组等))。然而,我看待它的方式是:如果我的类返回一个列表而不是IEnumerable,那么返回的数据可以与其他接受列表而不是IEnumerable作为参数的方法一起使用。这是“根据需要使用”的情况吗?或者将此视为一般规则并修改所有方法以接受IEnumerables而不是列表是更好的主意?我使用列表是因为我觉得性能会更好…@Omer:Resharper建议您应该更改类型,因为您实际上只将其用作可枚举项。你不应该改变所有的方法来使用<代码> iQueDebug ,而只是考虑它会比<代码>列表更适合。传递
列表
IEnumerable
在性能上没有任何区别,唯一的区别是编译器允许您使用它做什么。很抱歉占用您的时间,感谢您的帮助。我的意思是:void方法2(列表数据);接受列表,并使用列表方法(如Add等)。现在,需要将从上一个方法返回的列表传递到Method2(它需要一个列表)。返回IEnumerable,将其转换为列表,然后将该列表传递到Method2,这是一个更好的主意吗?或者忽略Resharper而只返回一个列表更有意义吗?(我有很多方法可以处理列表,也有一些不可以。它们都可以相互作用)。@Omer:如果你实际上是将列表作为列表使用,而不仅仅是迭代列表,那么将其作为
IEnumerable
传递是没有意义的。处理列表的另一种方法是将列表封装在一个类中,并让类的方法与列表一起工作。