0

我遇到了一些我以前从未见过的非常奇怪的东西,并想知道是否有人可以阐明这个问题:

旧代码:

if ((orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.ContentCreated
        || orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.NoContent)
    && orderFileCreationStatus.SpecialMeasureFileStatus != OrderFileCreationStatus.Status.Published
    && orderFileCreationStatus.PersonalisedProductFileStatus != OrderFileCreationStatus.Status.Published)
{
    webOrderHeader.OrderStatus = Domain.Duos.OrderStatus.AwaitingAuthorisation;
    webOrderHeader.AuthoriserUserId = null;
    UpdateWebOrderHeader(webOrderHeader);

    throw new Exception("Could not create the Order File for order ID: " + webOrderHeader.OrderId.ToString() + "rollback");
}

新代码:

if ((orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.ContentCreated || orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.NoContent))
{
    if(orderFileCreationStatus.SpecialMeasureFileStatus != OrderFileCreationStatus.Status.Published)
    {
        if(orderFileCreationStatus.PersonalisedProductFileStatus != OrderFileCreationStatus.Status.Published)
        {
            webOrderHeader.OrderStatus = Domain.Duos.OrderStatus.AwaitingAuthorisation;
            webOrderHeader.AuthoriserUserId = null;
            UpdateWebOrderHeader(webOrderHeader);

            throw new Exception("Could not create the Order File for order ID: " + webOrderHeader.OrderId.ToString() + "rollback");
        }
    }
}               

现在就 resharper 而言,这两个 if 语句是相同的,但这就是问题所在。

在旧代码中,调试器跳过嵌套在 IF 中的前三行并抛出异常。

在新代码中,这完美地工作。有没有人经历过这种情况,更重要的是是什么原因造成的。我很想知道。

4

2 回答 2

2

这个逻辑永远不会成立:

if(orderFileCreationStatus.SpecialMeasureFileStatus != orderFileCreationStatus.SpecialMeasureFileStatus)

您正在将值类型与其自身进行比较,这将始终为真,然后始终将其否定为假。

于 2013-06-12T15:33:48.907 回答
0

陈述是相同的。问题必须在于正在运行的代码版本。尝试将 If 块拆分为新的控制台应用程序,看看是否可以再次重现差异:

static void Main(string[] args)
{
    bool A = true;
    bool B = false;
    bool C = true;
    bool D = true;

    bool result1 = (A || B) && C && D;
    Console.WriteLine("Old way: " + result1);

    bool result2 = false;
    if (A || B)
    {
        if (C)
        {
            if (D)
            {
                result2 = true;
            }
        }
    }

    Console.WriteLine("New way: " + result2);

    Console.ReadKey();
}
于 2013-06-12T17:57:34.717 回答