Как подавить VB «Итерационная переменная не должна использоваться в лямбда-выражении» - PullRequest
5 голосов
/ 30 сентября 2010

Я работаю с LINQ в VB.NET и иногда получаю запрос вроде

For i = 0 To 10
  Dim num = (From n In numbers Where n Mod i = 0 Select n).First()
Next

и затем появляется предупреждение " Использование переменной итерации в лямбда-выражении может привести к неожиданным результатам. Вместо этого создайте локальную переменную внутри цикла и присвойте ей значение переменной итерации."

Я знаю, что не рекомендуется использовать итерационную переменную в лямбда-выражении, потому что лямбда-выражения оцениваются только при необходимости. ( Этот вопрос об этом)

Теперь мой вопрос: как подавить это предупреждение в тех случаях, когда выражение вычисляется на месте, с помощью таких конструкций, как First (), Single (), ToList () и т. Д. (Это всего лишь предупреждение, но мне нравится мой код чистый.)

(Объявление локальной переменной и передача ей итерационной переменной - вариант, но я ищу чистое решение.)

1 Ответ

5 голосов
/ 01 октября 2010

В этом конкретном случае, когда лямбда-выражение вычисляется немедленно, вы можете безопасно устранить предупреждение, переместив объявление переменной итерации за пределы цикла for.

Dim i = 0
For i = 0 To 10 
 ...

Я хочу подчеркнуть, что это работает, только если лямбда не выходит из цикла for (верно для вашего сценария).

Также здесь есть подробная ссылка на статью, которую я написал об этом предупреждении (почему оно существует, как его избежать и т. Д ...)

...