的情况是真实的,即使它应该是假的
问题描述:
我有这个条件:的情况是真实的,即使它应该是假的
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
。手镯有问题吗?我找不到任何东西。
答
这是你的表情。
(
(
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
也许将它分解为变量,因此它不是所有一个不可读的行。 – Ryan
最后的|| (!r.Reserved.IsReserved)'忽略ID –
我认为这是真的,因为!r.Reserved.IsReserved是真的。 – Ben