我在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没有给我任何提示。为什么?
答案 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
的情况下。