为什么在对List进行插入时Resharper不建议使用linq?

时间:2018-08-27 11:04:39

标签: c# resharper

我在Visual Studio 2017中使用Resharper 2018.1.3(我更新到2018.2.0,并且遇到了相同的问题)。

当我输入此代码时:

var test = new List<string>();
var strings = new[] { "a", "b", "c" };
foreach (var a in strings)
{
    test.Add(a);
}

Resharper建议将其转换为LINQ表达式。

但是如果我使用List

var test = new List<string>();
var strings = new List<string> { "a", "b", "c" };
foreach (var a in strings)
{
    test.Add(a);
}

Resharper没有给我任何提示。为什么?

1 个答案:

答案 0 :(得分:5)

尽管在这种特殊情况下,向LINQ的转换看起来很安全,但通常会产生意外的副作用。 System.Collections.Generic.List具有GetEnumerator方法的特殊实现,该方法返回一个结构。 LINQ方法与IEnumerable一起使用,其中GetEnumerator方法返回接口IEnumerator的实例。因此,将foreach转换为LINQ会导致意外装箱。

在某些情况下,GetEnumerator使用的foreach方法和IEnumerable.GetEnumerator的实现可以返回完全不同的Enumerator,就像我们在IDictionary中所拥有的,其中{{1 }}枚举GetEnumerator上的内容,而DictionaryEntry的实现则遍历实际上是IEnumerable.GetEnumerator实例的对象,在KeyValuePair的情况下。