在 Resharper 5 中,以下代码导致警告“参数可以用基本类型声明” list
:
public void DoSomething(List<string> list)
{
if (list.Any())
{
// ...
}
foreach (var item in list)
{
// ...
}
}
在 Resharper 6 中,情况并非如此。但是,如果我将方法更改为以下内容,我仍然会收到该警告:
public void DoSomething(List<string> list)
{
foreach (var item in list)
{
// ...
}
}
原因是,在这个版本中,list 只枚举了一次,因此将其更改为IEnumerable<string>
不会自动引入另一个警告。现在,如果我手动更改第一个版本以使用 aIEnumerable<string>
而不是 a ,我将在方法主体中的List<string>
两次出现时都收到该警告(“IEnumerable 的可能多重枚举”) :list
public void DoSomething(IEnumerable<string> list)
{
if (list.Any()) // <- here
{
// ...
}
foreach (var item in list) // <- and here
{
// ...
}
}
我明白,为什么,但我想知道如何解决这个警告,假设该方法真的只需要 aIEnumerable<T>
而不是 a List<T>
,因为我只想枚举项目并且我不想更改列表。在方法的开头
添加 a会使警告消失:list = list.ToList();
public void DoSomething(IEnumerable<string> list)
{
list = list.ToList();
if (list.Any())
{
// ...
}
foreach (var item in list)
{
// ...
}
}
我明白,为什么这会使警告消失,但对我来说它看起来有点像黑客......
任何建议,如何更好地解决该警告并仍然在方法签名中使用最通用的类型?
为了一个好的解决方案,应该解决以下问题:
- 不调用
ToList()
内部方法,因为它有性能影响 - 没有使用
ICollection<T>
甚至更专业的接口/类,因为它们改变了从调用者看到的方法的语义。 - 没有多次迭代
IEnumerable<T>
,因此有多次或类似访问数据库的风险。
注意:我知道这不是 Resharper 问题,因此,我不想取消此警告,而是修复根本原因,因为警告是合法的。
更新:
请不要关心Any
和foreach
. 我不需要帮助将这些语句合并为只有一个可枚举的枚举。
在这种方法中,它真的可以是任何多次枚举可枚举的东西!