ReSharper 以错误的方式检测 "Expression is always true"
ReSharper detects "Expression is always true" in a wrong way
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
标有 "Expression is always true" 消息,因此我的整个 else
语句被视为不必要。
我发现这个假设是基于order.PayForm
做出的。 ReSharper 假定调用 order
对象的 PayForm
属性 意味着它肯定不为空。删除此行会消除 "Expression is always true" 消息。
显然应该用 "Possible null" 消息标记 int payForm = order.PayForm;
行。
这是一个错误还是我遗漏了什么?
这里没有错,表达式始终为真,因为如果 order == null,NullReferenceException 将在前一行抛出,位于:
int payForm = order.PayForm;
所以如果没有抛出异常,则订单对象不为空
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
标有 "Expression is always true" 消息,因此我的整个 else
语句被视为不必要。
我发现这个假设是基于order.PayForm
做出的。 ReSharper 假定调用 order
对象的 PayForm
属性 意味着它肯定不为空。删除此行会消除 "Expression is always true" 消息。
显然应该用 "Possible null" 消息标记 int payForm = order.PayForm;
行。
这是一个错误还是我遗漏了什么?
这里没有错,表达式始终为真,因为如果 order == null,NullReferenceException 将在前一行抛出,位于:
int payForm = order.PayForm;
所以如果没有抛出异常,则订单对象不为空