ReSharper错误地检测到“表达始终为真”

时间:2020-02-11 14:21:10

标签: c# .net resharper

ReSharper似乎以非常简单(太简单)的方式解决了这种情况:

public ActionResult Payment()
{
    IOrder order = PaymentBase.GetOrderFromRequest(this.Request.Params); //this method can return null sometimes

    int payForm = order.PayForm;
    if (order != null)
        PaymentService.Check(order, "push", payForm);
    else
        LogsService.SaveDataLog(WebShopLogType.PaymentInfo, "order missing on push", (object)this.Request.Params.ToString(), "p");

    return new EmptyResult();
}

我的空检查order != null被标记为“表达式始终为真”消息,因此我的整个else语句被视为不必要。

我发现该假设是基于order.PayForm进行的。 ReSharper假定调用PayForm对象的order属性意味着它肯定不是null。删除此行将消除“表达式始终为真” 消息。

显然,应该在int payForm = order.PayForm;行中标记“可能为空” 消息。

这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:6)

这里没有什么错,该表达式始终为真,因为如果order == null,则在以下位置将NullReferenceException抛出一行:

int payForm = order.PayForm;

因此,如果未引发异常,则订单对象不为空