为什么ReSharper告诉我“User.Identity == null”总是假的?

我的一个ASP.NET MVC Controller类中有一个简单的属性。

在此处输入图像描述

我以前见过这么多次,所以要明白这个信息的含义,但通常它是完全合理的。 然而,这不是。 要获得带下划线的语句, User必须为null,因此检查User.Identity就可以了。

Identity属性是IPrincipal接口的一部分,并返回inheritanceIIdentity的对象。

要inheritance此接口或任何接口,此属性必须是引用类型,因此可能为null,对吧?

那么为什么我心爱的ReSharper呻吟?

您说您使用GenericPrinciple作为IPrincipal的实现。 对于此类, Identity属性实际上永远不能为null 。 如果你查看源代码很容易看到(例如使用JetBrains dotPeek )。

您可以感谢ReSharper的.NET框架类库的代码注释。

在我的ReSharper 6.1注释中,有与此相关的单个代码注释(在文件ExternalAnnotations \ mscorlib \ mscorlib.4.0.0.0.Nullness.Generated.xml中 ):

       

这只是针对构造函数,我没有为Identity属性找到一个。 因此,要么您正在使用具有该属性注释的ReSharper版本,要么ReSharper正在进行一些额外的分析。

无论如何,ReSharper很聪明(而且正确!)。