这是resharper中的一个错误吗?

时间:2015-06-18 12:06:37

标签: c# resharper ienumerable

我在这里有一些Resharper曲线。

enter image description here

他们告诉我,我有一个可能的多个IEnumerable枚举。但是你可以看到这不是真的。 最终明确声明为列表(List<Point2D>), pointTangents 先前声明为List<PointVector2D>

关于为什么Resharper可能告诉我这件事的任何想法?

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

正如你在下面看到的那样,即使Bar被宣布为IEnumerable为arg,也没有曲线和警告。

enter image description here

2 个答案:

答案 0 :(得分:3)

看起来很像RSRP-429474 False-positive warning for possible multiple enumeration

  

我有这段代码:

List<string> duplicateLabelsList = allResourcesLookup.SelectMany(x => x).Select(x => x.LoaderOptions.Label).Duplicates<string, string>().ToList(); ; 
if (duplicateLabelsList.Any()) 
throw new DuplicateResourceLoaderLabelsException(duplicateLabelsList);
     

对于duplicateLabelsList的两种用法,我都被警告过   尽管事实上我已经调用了ToList和   因此不应该有多重枚举。

其中(目前)的修订版本为9.2,目前尚未发布。

答案 1 :(得分:-1)

为类型public static TSource Last<TSource>(this IEnumerable<TSource> source);定义了扩展方法IEnumberable<TSource>

如果看一下Last<TSource>的实现:

public static TSource Last<TSource>(this IEnumerable<TSource> source)
{
    if (source == null) throw Error.ArgumentNull("source");
    IList<TSource> list = source as IList<TSource>;
    if (list != null)
    {
         int count = list.Count;
         if (count > 0) return list[count - 1];
    }
    else
    {
         using (IEnumerator<TSource> e = source.GetEnumerator()) 
         {
              if (e.MoveNext())
              {
                    TSource result;

                    do
                    {
                       result = e.Current;
                    } while (e.MoveNext());

                    return result;
              }
         }
    }
    throw Error.NoElements();
}

很明显,如果source实现IList,那么source不会被枚举,因此您认为这是 Resharper 中的“错误”是正确的

我认为它更像是误报可能是因为 Resharper 没有一般方法知道Last()的实现避免了不必要的枚举。它可能决定根据为Last<TSource>个对象定义IEnumerable<T>这一事实来标记潜在的多重枚举。