2011-09-28 70 views
7

我刚开始使用ReSharper,我试图找出为什么它认为这段代码是错误的。ReSharper“可能的NullReferenceException”与FileInfo错误?

var file = new FileInfo("foobar"); 
return file.Directory.FullName; 

它将file.Directory突出显示为“Possible System.NullReferenceException”。我不知道这是如何实现的,因为文件对象不能为空,我也不知道从FileInfo对象返回的DirectoryInfo对象如何可以为null。

回答

11

Directory属性确实可以是null。该属性的实现是大致

public DirectoryInfo Directory { 
    get { 
     string directoryName = this.DirectoryName; 
     if (directoryName == null) { 
      return null; 
     } 
     return new DirectoryInfo(directoryName); 
    } 
} 

它绝对可以返回null。这里有一个具体的例子

var x = new FileInfo(@"c:\"); 
if (x.Directory == null) { 
    Console.WriteLine("Directory is null"); // Will print 
} 
+1

此外:可以使用['file.DirectoryName'](http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx),它将返回“目录的完整路径”,还应该为''c:\“'工作。 –

0

看看代码。每个点表示钻到另一个对象。正如你所说的“文件对象永远不能为空”(正确),在这个等式中还有什么其他对象可能是空的。提示:它不是FullName。

+0

请阅读帖子到最后,你会发现这个:“[...],我无法弄清楚从FileInfo对象返回的DirectoryInfo对象是如何为空的。”所以OP意识到这一点。 – UrbanEsc

+0

更准确地说,'.'表示内存位置将被取消引用的时间,因为它可能正在调用属性,方法等。因此,无论何时您使用点符号,您都需要在尝试对其进行解引用之前检查该对象是否为* something *。 – Yuck

+0

@UrbanEsc:那么OP是不正确的,你可能会得到一个没有有效目录的文件。 –