条件为TRUE,即使它应该为FALSE

时间:2017-08-14 10:52:04

标签: c# asp.net asp.net-mvc

我有这个条件:

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,这意味着如果Ids相同,它应该只是true。但是,即使s.Id = 4且r.Reserved.Id = 7,条件也为true。手镯有问题吗?我找不到任何。

2 个答案:

答案 0 :(得分:3)

这是你的表达。

(
    (
        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)) {
    ⋮
}

还有额外的好处,可以准确地说明哪些值会影响条件。

答案 1 :(得分:0)

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运算符(||)的使用,如果任何一个条件(一个或两个)为True,则if语句将返回True。这就是说,如果你确定条件一应该是假的而你仍然是真的,那就意味着你的条件二是真的 - 即!r.Reserved.IsReserved是真的