2015-11-10 4 views
0

Этот код работает отлично:Комбинированное утратившим значение проверки

policy.ProviderID > 0 ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null 

но Resharper жалуется, что policy.ProviderID.Value потребности быть null проверены (чтобы предотвратить InvalidOperationException).

Насколько мне известно, условие будет оценивать только значение true для значения, отличного от 0, и поэтому дальнейшая проверка не требуется.

Должен ли я регистрировать это как ошибку с JetBrains? Или я что-то не понял.

+1

Что такое тип policy.ProviderID? – Matt

+0

@Matt Видимо 'int?' –

+1

@ ИванСтоев, как вы пришли к такому выводу? Я не вижу ничего, чтобы подтвердить, что он относится к этому типу. –

ответ

6

Я подозреваю, что R # жалуется, потому что он не знает, что policy.ProviderID вернет одинаковое значение для обеих оценок. Рассмотрим:

private readonly int? providerId; 

public int? EvilProviderId => DateTime.UtcNow.Second == 0 ? null : providerId; 

Теперь рассмотрим ваш код; - условие может быть правдой, потому что первый вызов выполняется на втором 59 ... но потом тиков до второго вызова, который затем возвращать нуль, в результате чего a NullReferenceException.

Если является почему R # жалуется, просто извлечь локальную переменную:

int? providerId = policy.ProviderId; 
// Use providerId in both cases in your expression 
+0

Я получаю то же поведение локально. Однако, изменив его на 'var t = p.ProviderID.HasValue? (int?) p.ProviderID.Value: null; 'удаляет предупреждение, но все еще уязвим к ситуации, о которой вы указали. Возможно, из-за того, что R # не отличает 'int?' От любого другого 'Nullable ', где 'T' может перегружать операторы. Интересно, тем не менее – Rob

+0

Кроме того, ваше исправление для извлечения локальной переменной действительно удаляет предупреждение. – Rob

+0

Я смутно думал об этом, но если проверка «> 0» заменена (или дополнена) «! = Null», то Resharper удаляет предупреждение, поэтому я подумал, что это должно быть что-то другое. –

0

Используйте это вместо того, чтобы:

(policy != null && policy.ProviderID.HasValue && policy.ProviderID. Value > 0) ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null 
+0

Whaw, и все, что только для того, чтобы сделать ReSharper счастливым? Код OP совершенно прав, если свойство не мутирует между вызовами, но если это так, ваш фрагмент кода также не будет работать. –

+0

Извините, downvote не нужен ... я пытаюсь помочь .. –

Смежные вопросы