为什么 resharper 不建议在遍历列表时使用 linq?

Why resharper does not suggest to use linq when interating over a List?

我在 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 没有给我提示。为什么?

虽然在这种特殊情况下,转换为 LINQ 看起来很安全,但通常它可能会产生意想不到的副作用。 System.Collections.Generic.List 有一个特殊的 GetEnumerator 方法实现,它 return 是一个结构。 LINQ 方法适用于 IEnumerable,其中 GetEnumerator 方法 return 接口实例 IEnumerator。因此,将 foreach 转换为 LINQ 可能会导致不需要的装箱。

在某些情况下,foreach 使用的 GetEnumerator 方法和 IEnumerable.GetEnumerator 的实现可以 return 完全不同于我们在 [=20] 中的 Enumerator =] 其中 GetEnumerator 枚举超过 DictionaryEntry,而 IEnumerable.GetEnumerator 的实现迭代对象,在 System.Collections.Generic.Dictionary.[=26= 的情况下,这些对象实际上是 KeyValuePair 的实例]