C# 条件是真的,即使它应该是假的

C# 条件是真的,即使它应该是假的,c#,asp.net,asp.net-mvc,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)){} if((s.Id==r.Reserved.Id&&(r.DateFromDateTime.Now

我有这种情况:

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

条件的第一部分是
s.Id==r.Reserved.Id
,这意味着只有当Id相同时才应该是
true
。但是,即使例如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)
并重新组织以避免重复
datumod2
检查:

!r.Reserved.IsReserved ||
    s.Id == r.Reserved.Id &&
    (datumod2 == datumted2 ||
        r.DateFrom < DateTime.Now && r.DateTo > DateTime.Now)
在没有上下文的情况下,现在很难判断,但您可能希望创建一个函数:

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、 保留。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
)
if(
( 
//条件一
(s.Id==r.Reserved.Id&&
(r.DateFromDateTime.Now | | datumdo2==datumted2)
//条件一结束
) || 
(!r.Reserved.IsReserved)//条件二
)

因为使用
运算符(
|
),如果其中一个条件(一个或两个)为真,if语句将返回真。也就是说,如果你确定条件一是假的,而你仍然在变为真,那就意味着条件二是真的——也就是说!r、 Reserved.IsReserved是真的

可能会将其分解为变量,这样它就不是一行不可读的。最后的
| |(!r.Reserved.IsReserved)
忽略idI,我认为它是真的,因为!r、 Reserved.IsReserved是真的。
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)) {
    ⋮
}
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
)