我在这里有一些Resharper曲线。
他们告诉我,我有一个可能的多个IEnumerable枚举。但是你可以看到这不是真的。 最终明确声明为列表(List<Point2D>
), pointTangents 先前声明为List<PointVector2D>
关于为什么Resharper可能告诉我这件事的任何想法?
编辑实验查看是否可以使用更简单的代码进行复制
正如你在下面看到的那样,即使Bar被宣布为IEnumerable为arg,也没有曲线和警告。
答案 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>
这一事实来标记潜在的多重枚举。