c# - 为什么 .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 上运行。任何想法为什么它会这样?执行虚假陈述?谢谢
解决方案
您的 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
}
推荐阅读
- keycloak - 如何使用 admin-cli 将角色添加到 keycloak 中的默认角色
- python - 为什么我无法在我的图表中获得正确的日期?
- amazon-s3 - 你什么时候想让 s3 对象键相似
- ionic-framework - 如何在网络浏览器视图中从我的 Ionic 应用程序打开外部链接
- android - 在矩形内绘制圆角
- android - 如何将谷歌地图上的交通数据解析为json?
- javascript - 地图 Js 中的逗号
- javascript - 如果在选择器中使用变量,则未正确选择子元素
- java - 找不到符号 [ERROR] 符号:方法 getlogger(java.lang.Class
) - sql - SAP HANA -count(*) 给出不同的输出