Возможно многократное перечисление предупреждения IEnumerable с помощью .GetType()

Я получаю предупреждение ReSharper «Возможно множественное перечисление IEnumerable» со следующим кодом:

public void Mymethod(IEnumerable<int> entities)
{
   var enumerator = entities.GetEnumerator();
   var entityType = entities.GetType();
}

Как и во многих описанных темах stackoverflow (а также на http://confluence.jetbrains.net/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable) ReSharper распознает, что запрос выполняется дважды.

Мой вопрос в том, почему оператор «GetType()» распознается как запрос.

Любое предложение?

заранее спасибо.


person rhe1980    schedule 17.01.2012    source источник
comment
Я почти уверен, что это относится к строке enumerator. Вероятно, он ищет соответствующий Dispose() вызов.   -  person Jeff Mercado    schedule 17.01.2012
comment
Я получаю предупреждение для обоих утверждений. Это также происходит, если я вызываю .GetType() только два раза вместо .GetEnumerator().   -  person rhe1980    schedule 17.01.2012
comment
@AakashM: спасибо за отправку, но трекер. похоже ошибка будет исправлена ​​в следующей версии. Жду обновления ;-)   -  person rhe1980    schedule 29.02.2012


Ответы (2)


Просто Resharper недостаточно умен. GetType не является виртуальным методом, он не может повлиять на IEnumerable.

person porges    schedule 17.01.2012

Чтобы GetTypes был вызван, entities нужно будет оценить с точки зрения ReSharper (он не знает, потребует ли GetTypes вычисление перечисления, поэтому он говорит "возможно множественное перечисление "). Поскольку ReSharper видит, что в методе есть несколько мест, где у вас есть один и тот же сценарий, он выдает это предупреждение.

Это может быть проблемой, а может и не быть, в зависимости от того, что представляет собой entities и какую операцию вы выполняете над ним. Если он представляет массив в памяти или вы выполняете операцию, которая не выполняет итерацию по списку, беспокоиться не о чем. Если вы выполняете итерацию по нему, и он представляет собой запрос, который будет отправлен в базу данных, вероятно, будет хорошо перечислить его явно (вызвав ToList или ToArray) и вместо этого воздействовать на результат.

person Fredrik Mörk    schedule 17.01.2012
comment
entities — это объект в определенном состоянии. Как вызов object.GetType может изменить это государство? - person dtb; 17.01.2012
comment
@dtb: я немного не понял; это говорит с точки зрения ReSharper. Спасибо, что указали на это, я обновил ответ, чтобы уточнить это. - person Fredrik Mörk; 17.01.2012