簡體   English   中英

為什么.NET在錯誤的IF語句上執行代碼?

[英]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
}

讓我們重新整理一下代碼(請刪除諸如stringobject類的名稱;將它們更改為有意義的名稱):

  // 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM