C# 这是resharper中的错误吗?

C# 这是resharper中的错误吗?,c#,resharper,ienumerable,C#,Resharper,Ienumerable,我这里有一些再竖琴曲 他们告诉我,我有一个可能的IEnumerable的多重枚举。但是你可以看到这不是真的final显式声明为列表(list),而点切线先前声明为list 知道为什么Resharper会告诉我这些吗 编辑实验,看看是否可以用更简单的代码进行复制 正如您在下面看到的,即使Bar声明将IEnumerable作为arg,也没有任何扭曲和警告 扩展方法公共静态TSource Last(此IEnumerable源代码)是为类型IEnumberable定义的 如果查看Last的实现: pu

我这里有一些再竖琴曲

他们告诉我,我有一个可能的IEnumerable的多重枚举。但是你可以看到这不是真的final显式声明为列表(
list
),而点切线先前声明为
list

知道为什么Resharper会告诉我这些吗

编辑实验,看看是否可以用更简单的代码进行复制

正如您在下面看到的,即使Bar声明将IEnumerable作为arg,也没有任何扭曲和警告


扩展方法
公共静态TSource Last(此IEnumerable源代码)是为类型
IEnumberable
定义的

如果查看
Last
的实现:

publicstatictsource Last(此IEnumerable源)
{
if(source==null)抛出错误.ArgumentNull(“source”);
IList list=源作为IList;
如果(列表!=null)
{
int count=list.count;
如果(计数>0)返回列表[计数-1];
}
其他的
{
使用(IEnumerator e=source.GetEnumerator())
{
if(如MoveNext())
{
t来源结果;
做
{
结果=e.电流;
}while(e.MoveNext());
返回结果;
}
}
}
抛出错误。NoElements();
}
很明显,如果
source
实现了
IList
,那么
source
不会被枚举,因此您认为这是Resharper中的“bug”是正确的

我认为它更像是一个假阳性,可能是因为RESHARPER没有一般的方法知道 LAST())/Case>的实现避免了不必要的枚举。它可能是基于为类型化的

IEnumerable
对象定义了
Last
这一事实来决定标记潜在的多重枚举。

看起来很像:

我有以下代码:

List<string> duplicateLabelsList = allResourcesLookup.SelectMany(x => x).Select(x => x.LoaderOptions.Label).Duplicates<string, string>().ToList(); ; 
if (duplicateLabelsList.Any()) 
throw new DuplicateResourceLoaderLabelsException(duplicateLabelsList);
List duplicateLabelList=allResourcesLookup.SelectMany(x=>x).Select(x=>x.LoaderOptions.Label).Duplicates().ToList();
if(DuplicateLabelList.Any())
抛出新的DuplicateResourceLoaderLabelException(DuplicateLabelList);
对于重复标签列表的两种用法,我都被警告 可能的多重枚举,尽管我调用了ToList和 因此,不应该有多重枚举


哪个(当前)有9.2的修复版本,哪个(当前)还没有发布。

什么类型是
点切线
?这是从哪里来的?问题是这是一个列表。清单要准确。不是IEnumerable,这就是为什么resharper不应该给出此警告。显示更多代码-是否可以作为
IEnumerable
传入?为什么不自己计算第一个/最后一个?将鼠标移到突出显示的两个类型上,它们都在该范围内的列表中?如果是,看起来像是一个重拾器错误。我做了一个测试。看一下屏幕截图。Resharper能够理解差异。@BradGonesSurfing在传递
IEnumerable
时,您是否尝试过查看Resharper是否标记相同的代码?我不认为这段代码和你的原始版本完全一样。是的。我试着通过一个IEnumerable,它会标记它。将它与列表交换,它不会标记它。它会标记多个枚举,因为存在多个枚举。关键是Resharper通常不会标记列表的多个枚举,因为它知道其中的枚举不涉及昂贵的操作,例如发出数据库查询。AFEK只查看枚举的类型,是否存在多个枚举,以及是否需要注释/属性。tl;dr有多个枚举,但当可枚举的类型为List时,Resharper通常会忽略这些枚举。@StephenKennedy但这就是重点:
First
Last
不枚举。查看实现,当传递的对象实现IList时,它只返回
list[0]
list[count-1]
List<string> duplicateLabelsList = allResourcesLookup.SelectMany(x => x).Select(x => x.LoaderOptions.Label).Duplicates<string, string>().ToList(); ; 
if (duplicateLabelsList.Any()) 
throw new DuplicateResourceLoaderLabelsException(duplicateLabelsList);