Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我将null强制转换到另一个类时会发生什么_C#_Resharper - Fatal编程技术网

C# 当我将null强制转换到另一个类时会发生什么

C# 当我将null强制转换到另一个类时会发生什么,c#,resharper,C#,Resharper,我在库方法中有一些代码,如下所示: public static WebDavProviderBase GetProvider(string relativePath) { if (relativePath == null) return (WebDavProviderBase) null; if (relativePath.Length == 0) return (WebDavProviderBase) new DefaultProvider(); WebDavPro

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

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
}
当我使用代码时,它看起来是这样的:

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)抱怨空检查,并说这是一个多余的检查,因为提供者永远不能为空

Resharper是否错误,或者
(WebDavProviderBase)是否为null
返回新的WebDavProviderBase

按要求截图:

更新: 在得到Jebs以下答案的帮助后,得出以下结论:
调用GetProvider时,relativePath不能为null,因为应用程序将由于代码中的relativePath.Length检查而崩溃。(见屏幕截图)

让我们从解决您的结论性问题开始。其中有两个,合并成一个(请尽量避免这样),因此我将把它们分开,一次回答一个:

Resharper错了吗

对。嗯,也许。。。稍后再谈

。。。或者
(WebDavProviderBase)null是否返回新的WebDavProviderBase

没有


Visual Studio 2015专业版。。。表示这是多余的检查,因为提供程序永远不能为null

这也许只是巧合地与你所问的问题有关,但解释一下我认为这里到底发生了什么可能会有所帮助。VS2015可能正在执行某种形式的推断,推断当
relativePath
为非空时,返回值也将为非空。这里有两个先决条件:

  • VS2015能否仅通过查看您编写的代码就推断出
    relativePath
    是非空的?例如,如果您将其指定为一个常量值,则答案是肯定的“是”更新:保证
    .ToString()
    方法返回字符串或引发异常,因此编译器很可能推断
    相对路径
    在此处始终为非null
  • VS2015能否推断非空
    relativePath
    值对应于非空
    GetProvider
    返回值?这涉及到代表编译器的更复杂的功能,但它并不在编译领域之外。。。如果编译器可以按照您的逻辑推断
    null
    不可能返回,那么它可以安全地告诉您
    null
    检查是错误的

整形器错误。或者你发布的代码太简单了。注意,我没有得到Resharper警告(我使用的是R#10.0.2)。所以我怀疑你没有发布正确的回复。我已经用完整的第三方库代码更新了这个问题,以防有什么不同。还要注意的是,这段代码位于第三方dll中。刚刚意识到,它不是Resharper给出错误,而是Visual Studio 2015 Professional。再次更新了问题。如果您编写
WebDavProviderBase.GetProvider(null),会发生什么相反?请发布您收到的完整错误消息。另外,如果可能的话,请提供一个只使用我们有权访问的类的方法。我已经尝试跟踪relativePath的创建,但我无法真正完成真正的创建。@andreasnico演绎不仅基于值,而且基于操作。。。例如,如果在调用
WebDavProviderBase.GetProvider
之前在
relativePath
上使用了任何
String
方法(例如
String.Length
),这就足以让这样的推断通过,因为异常会在调用方法之前中断执行。啊,所以relativePath.Length(se最近添加的屏幕截图)当然会在调用GetProvider之前使整个过程崩溃,因此在调用GetProvider时relativePath不能为null。非常感谢。即使他们这样做了,编译器也会注意到方法被重写,并相应地调整它的演绎。@andreasnico确实如此。我的错。。。
中可能使用了字符串方法(或数组索引)。如果
请求,RemoveTrailingFlash
将引发异常。Path
null
。。。也许您可以添加一些
null
检查并
返回null
,看看这会如何改变情况?