Почему Resharper не предлагает использовать linq при взаимодействии со списком? - PullRequest
0 голосов
/ 27 августа 2018

Я использую Resharper 2018.1.3 (я обновил до 2018.2.0 и у меня возникла та же проблема) с Visual Studio 2017.

Когда я набираю этот код:

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

Решарпер предлагает преобразовать его в LINQ-выражение.

Но если я использую List:

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

Решарпер не дает мне намека. Почему?

1 Ответ

0 голосов
/ 28 августа 2018

Хотя в данном конкретном случае преобразование в LINQ выглядит безопасным, в целом оно может иметь неожиданные побочные эффекты. System.Collections.Generic.List имеет специальную реализацию метода GetEnumerator, которая возвращает структуру. Методы LINQ работают с IEnumerable, где GetEnumerator методы возвращают экземпляр интерфейса IEnumerator. Таким образом, преобразование foreach в LINQ может вызвать нежелательный бокс.

В некоторых случаях GetEnumerator метод, используемый foreach и реализация IEnumerable.GetEnumerator, может возвращать совершенно разные Enumerator s, как мы имеем в IDictionary, где GetEnumerator перечисляет более DictionaryEntry s при реализации IEnumerable.GetEnumerator перебирает объекты, которые на самом деле являются экземплярами KeyValuePair в случае System.Collections.Generic.Dictionary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...