的情况是真实的,即使它应该是假的

问题描述:

我有这个条件:的情况是真实的,即使它应该是假的

if (((s.Id == r.Reserved.Id && (r.DateFrom < DateTime.Now || datumod2 == datumted2)) && (r.DateTo > DateTime.Now || datumdo2 == datumted2)) || (!r.Reserved.IsReserved)){} 

条件的第一部分是s.Id == r.Reserved.Id这意味着它应该只是true如果ID是相同的。但是,即使s.Id = 4且r.Reserved.Id = 7,条件为true。手镯有问题吗?我找不到任何东西。

+2

也许将它分解为变量,因此它不是所有一个不可读的行。 – Ryan

+1

最后的|| (!r.Reserved.IsReserved)'忽略ID –

+1

我认为这是真的,因为!r.Reserved.IsReserved是真的。 – Ben

这是你的表情。

(
    (
     s.Id == r.Reserved.Id && 
     (r.DateFrom < DateTime.Now || datumod2 == datumted2) 
    ) && 
    (r.DateTo > DateTime.Now || datumdo2 == datumted2) 
) || 
    (!r.Reserved.IsReserved) 

正如你可以看到,当它不是全部挤在一条线,病情也时!r.Reserved.IsReserved是真的是真的。现在

,设有一对夫妇混乱的括号,因此让我们这些出来:

(
    s.Id == r.Reserved.Id && 
    (r.DateFrom < DateTime.Now || datumod2 == datumted2) && 
    (r.DateTo > DateTime.Now || datumdo2 == datumted2) 
) || !r.Reserved.IsReserved 

和重组,以避免重复datumod2检查:

!r.Reserved.IsReserved || 
    s.Id == r.Reserved.Id && 
    (datumod2 == datumted2 || 
     r.DateFrom < DateTime.Now && r.DateTo > DateTime.Now) 

,也许使得这种扩展(语法可能是错误的,但你明白了):

public static bool IsInside<T : IComparable<T>>(this T x, T lower, T upper) { 
    return lower < x && x < upper; 
} 

为:

!r.Reserved.IsReserved || 
    s.Id == r.Reserved.Id && 
    (datumod2 == datumted2 || DateTime.Now.IsInside(r.DateFrom, r.DateTo)) 

这很难说,在这一点上没有上下文,但也许你会想要做一个函数:

private static bool SatisfiesCondition(Foo r, Bar s, Baz datumod2, Baz datumted2) { 
    if (!r.Reserved.IsReserved) 
     return true; 

    if (s.Id != r.Reserved.Id) 
     return false; 

    if (datumod2 == datumted2) 
     return true; 

    return DateTime.Now.IsInside(r.DateFrom, r.DateTo); 
} 

重排条件,并挑选最大可理解,瞧名称:

if (SatisfiesCondition(r, s, datumod2, datumted2)) { 
    ⋮ 
} 

它具有拼写出哪些值会影响条件的额外好处。

TL; DR -
!r.Reserved.IsReserved是真


让我们拆开你的IF语句,以了解该问题:

if (
    ( 
    // Condition One 
     (s.Id == r.Reserved.Id && 
      (r.DateFrom < DateTime.Now || datumod2 == datumted2) 
     ) && 
     (r.DateTo > DateTime.Now || datumdo2 == datumted2) 
    // End Of Condition One 
    ) || 
    (!r.Reserved.IsReserved) // Condition Two 
) 

因为使用OR运营商(|| )如果条件(1或2)中的任何一个为真,您的if语句将返回True。也就是说,如果您确定Condition One应该是False并且您仍然变为True,那么意味着您的Condition Two是True - 即!r.Reserved.IsReserved为True