следить за предупреждением R #: возможно «System.InvalidOperationException» - PullRequest
6 голосов
/ 23 января 2012

У меня есть следующее выражение, где a.AnswerId имеет тип long?.ReSharper предупреждает о возможном InvalidOperationException в функции выбора.Был ли когда-нибудь случай, когда это могло произойти?(угловые тоже хорошо)

long[] ids = answers.Where(a => a.AnswerId.HasValue)
                    .Select(a => a.AnswerId.Value)
                    .ToArray();

Ответы [ 3 ]

7 голосов
/ 23 января 2012

Поскольку вы проверяете в Where, что a.AnswerId имеет значение, a.AnswerId.Value никогда не выдаст InvalidOperationException (если только другой поток не изменяет данные одновременно). Resharper обладает довольно хорошими возможностями анализа кода, но он не может распознать все, и в этом случае он не понимает, что Where позволяет безопасно вызывать .Value в Select, отсюда и предупреждение. Так что вы можете смело игнорировать это предупреждение.

4 голосов
/ 23 января 2012

К сожалению, ReSharper часто дает ложные срабатывания.В этом случае проблем не будет, если AnswerId возвращает одинаковое значение в вызовах Where и Select.(Убедитесь, что AnswerId не имеет какой-то сумасшедшей реализации, которая возвращает число при первом обращении к нему и null во второй раз.)

3 голосов
/ 30 января 2012

К сожалению, ReSharper не может отслеживать проверки состояния через последовательность лямбда-выражений LINQ.Это известная проблема.

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