当我将 null 转换为另一个 class 时会发生什么

What happens when I cast null to another class

我在库方法中有一些代码,如下所示:

public static WebDavProviderBase GetProvider(string relativePath)
{
  if (relativePath == null)
    return (WebDavProviderBase) null;
  if (relativePath.Length == 0)
    return (WebDavProviderBase) new DefaultProvider();
  WebDavProviderBase returnProvider = (WebDavProviderBase) null;
  if ((int) relativePath[0] == 47)
    relativePath = relativePath.Substring(1);
  WebDavProviderBase.GetRootProvider().MapPath(relativePath, out returnProvider);
  return returnProvider;
}

当我使用代码时,它看起来像这样:

WebDavProviderBase provider = WebDavProviderBase.GetProvider(relativePath);

if (provider == null)
{
    //Do something
}

但是,Resharper (10 Ultimate) 抱怨 null 检查,并说这是一个多余的检查,因为 provider 永远不能为 null。

Resharper 是错误的,还是 (WebDavProviderBase)null return 一个新的 WebDavProviderBase?

按要求截图:

更新: 从下面的 Jebs answer 获得帮助后,这是结论: 调用 GetProvider 时,relativePath 不能为 null,因为应用程序将因代码中的 relativePath.Lenght 检查而崩溃。 (见截图)

让我们首先回答您的结论性问题。有两个,合并为一个(请尽量避免),所以我将它们分开并一次回答一个:

Is Resharper wrong...?

是的。好吧,也许……稍后再说。

... or will (WebDavProviderBase)null return a new WebDavProviderBase?

没有


Visual Studio 2015 Professional ... says this is a superfluous check, because provider can never be null.

这可能只是巧合地与您提出的问题有关,但无论如何解释我认为这里发生的事情可能会有所帮助。 VS2015 可能正在执行某种形式的推导,推断当 relativePath 为非空时,return 值也将为非空。这里有两个先决条件:

  • VS2015 可以通过查看您编写的代码推断出 relativePath 是非空的吗?例如,如果您已将其分配给常数值,则答案是确定的 "yes"。 UPDATE.ToString() 方法保证 return 一个字符串或引发异常,因此编译器很可能推断出 relativePath 总是非-此处为空。
  • VS2015 能否推断出非空 relativePath 值对应于非空 GetProvider return 值?这涉及代表编译器的更复杂的功能,但它仍然不在编译范围之外......如果编译器可以遵循您的逻辑并推断出 null 不可能被 returned , 然后它可以安全地告诉你你的 null 检查是错误的。