2015-09-17 4 views
-1

Я нашел эту ошибку в своем текущем проекте, а затем воспроизвел в очень простом коде, который я разделяю здесь.ReSharper предлагает ошибочное выражение «Expression is always true»

Я использую ReSharper 8.0.2 и Visual Studio 2013.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var orders = new List<Order> { new Order {ClientId = 10}, new Order()}; 
     var firstOrder = orders.FirstOrDefault(); 
     if (firstOrder != null && firstOrder.ClientId.HasValue) 
     { 
      // In this line resharper suggests that t.ClientId.HasValue is always true. This is wrong. 
      var ordersWithClient = orders.Where(t => t.ClientId.HasValue).ToList(); 
     } 
    } 
} 

class Order 
{ 
    public int? ClientId { get; set; } 
} 
+1

Если вы обнаружили ошибку в Resharper, вы должны сообщить об этом JetBrains, не задавая здесь вопрос. – juharr

+0

в этом контексте ReSharper говорит прямо, что ваши кодовые заказы имеют один элемент, который не является нулевым. –

+0

@EhsanSajjad 'orders' имеет две записи. Второй имеет «null» 'ClientId'. – juharr

ответ

-1

его потому, что у вас уже есть условный оператор, который проверяет, если ClientId имеет значение прежде чем присваивать его переменной. Таким образом, выражение всегда верно.

+3

Оператор 'if' проверяет' firstOrder', но фактический код имеет дело с 'orders', который содержит' Order' с 'null'' ClientId'. – juharr

+0

Это не то, что проверяет его код. Он проверяет первый порядок, который уже установлен «ClientId». Почему выражение всегда истинно –

+0

'if' проверяет первый порядок, но Resharper говорит, что' t => t.ClientId.HasValue' всегда 'true', но это неверно, потому что' orders' содержит одну запись, где на самом деле является «ложным». – juharr