[英]Why .NET executes code on false IF statement?
我有以下代碼:
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.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
}
讓我們重新整理一下代碼(請刪除諸如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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.