首页 > 解决方案 > 为什么 .NET 在错误的 IF 语句上执行代码?

问题描述

我有以下代码:

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
}

我已经测试过从 DateTime 结构中添加 .Date 甚至指定确切的年份,但没有任何效果。

执行代码时,即使

someDate.Value.Date > dateFrom.Date

等于 1700 > 2018,执行的代码就好像它是真的一样,即使调试器说它是假的。

当我从条件中删除这部分时,以下代码:

someDate.HasValue && object.SomeOtherDate.HasValue

当我将 someDate 设为 null 时,因此 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 上运行。任何想法为什么它会这样?执行虚假陈述?谢谢

标签: c#.netif-statement

解决方案


您的 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
}

推荐阅读