我的一个ASP.NET MVC Controller类中有一个简单的属性。
我以前见过这么多次,所以要明白这个消息的含义,但通常它是完全合理的。但是,这不是。要使用带下划线的语句,User
必须 NOT 为空,因此检查User.Identity
就可以了。
Identity
属性是IPrincipal
interface的一部分,并返回一个继承IIdentity
的对象。
要继承此接口或任何接口,此属性必须是引用类型,因此可能为null,对吧?
那么为什么我心爱的ReSharper呻吟?
答案 0 :(得分:17)
您说您使用GenericPrinciple
作为IPrincipal
的实现。对于此类,Identity
属性实际上永远不会是null
。如果您查看源代码很容易看到(例如使用JetBrains dotPeek)。
您可以感谢ReSharper的.NET框架类库的代码注释。
在我的ReSharper 6.1注释中,有与此相关的单个代码注释(在文件 ExternalAnnotations \ mscorlib \ mscorlib.4.0.0.0.Nullness.Generated.xml 中):
<member name="M:System.Security.Principal.GenericPrincipal.#ctor(System.Security.Principal.IIdentity,System.String[])">
<parameter name="identity">
<attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</parameter>
</member>
这仅适用于构造函数,但我没有为Identity
属性找到一个。因此要么您正在使用具有该属性注释的ReSharper版本,要么ReSharper正在进行一些额外的分析。
无论如何,ReSharper很聪明(而且是对的!)。