Почему .NET выполняет код для ложного оператора IF? - PullRequest
0 голосов
/ 21 сентября 2018

У меня следующий код:

var dateFrom = DateTime.Parse(string.Format(string.Format("01.04.{0}", dateProperty.Value.AddYears(-1).Year))
if (object.nullablebool.HasValue ? object.nullablebool.Value : false  
&& (string == "V" || string == "N")
&& someDate.HasValue && object.SomeOtherDate.HasValue 
&& someDate.Value.Date > dateFrom.Date)
{
       >> Code
}

Я тестировал добавление .Date или даже указание точного года из структуры DateTime, но ничего не получалось.

При выполнении кода, даже если

someDate.Value.Date > dateFrom.Date

равно 1700> 2018, код выполняется так, как если бы он был истинным, даже если отладчик говорит, что он ложный.

Когда я удалил эту часть из условия, следующий код:

someDate.HasValue && object.SomeOtherDate.HasValue

Когда я сделал someDate пустым, поэтому someDate.HasValue равно false, оператор if все еще выполняется как true.

Что это исправило?Приведение этих двух условий к другому, если:

var dateFrom = DateTime.Parse(string.Format(string.Format("01.04.{0}", dateProperty.Value.AddYears(-1).Year))
if (object.nullablebool.HasValue ? object.nullablebool.Value : false  
&& (string == "V" || string == "N"))    
{
     if (someDate.HasValue && object.SomeOtherDate.HasValue 
     && someDate.Value.Date > dateFrom.Date)
     {
          >> Code
     }
     else 
     {
          >> Code 
     }           
}

Код работает, но он слишком уродлив.Я работаю на Visual Studio 2017 Pro.Есть идеи, почему он так себя ведет?Выполнение ложных утверждений?Спасибо

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Ваш оператор if работает иначе, чем ожидалось, потому что он анализируется иначе, чем вы ожидаете.object.nullablebool.HasValue ? object.nullablebool.Value : false && ... равно , проанализировано как object.nullablebool.HasValue ? object.nullablebool.Value : (false && ...).Так что, если object.nullablebool имеет значение, это результат условия.Чтобы это исправить, вы должны добавить круглые скобки так:

if ((object.nullablebool.HasValue ? object.nullablebool.Value : false )
&& (string == "V" || string == "N") 
&& someDate.HasValue && object.SomeOtherDate.HasValue 
&& someDate.Value.Date > dateFrom.Date)
{
     // if body
}
0 голосов
/ 21 сентября 2018

Давайте освежим ваш код (пожалуйста, избавьтесь от имен вроде string, object; измените их на осмысленные имена):

  // You don't want any formatting but a simple constructor
  var dateFrom = new DateTime(dateProperty.Value.Year - 1, 4, 1);    

  // object.nullablebool == true - if object.nullablebool has value and the value is true
  if (object.nullablebool == true && (string == "V" || string == "N")) {
    // if someDate.Value is null the result will be false 
    // All we have to do is to propagate the null: ?. in someDate?.Date
    if (someDate?.Date > dateFrom.Date && object.SomeOtherDate.HasValue) {
      // Code
    }
    else {  
      // Code
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...