我有这个条件:
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
。手镯有问题吗?我找不到任何。
答案 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是真的