Возможно многократное перечисление предупреждения 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)


arrow_upward
3
arrow_downward

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

person porges    schedule 17.01.2012

arrow_upward
0
arrow_downward

Чтобы 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