我的一个 ASP.NET MVC控制器类中有一个简单的属性。
我以前见过很多次,所以要理解这个消息的含义,但通常它是完全有意义的。然而,事实并非如此。要到达带下划线的语句,User
必须不为空,所以检查User.Identity
是好的。
该Identity
属性是IPrincipal
接口的一部分,并返回一个继承的对象IIdentity
。
要继承此接口或任何与此相关的接口,此属性必须是引用类型,因此可能为 null,对吗?
那么为什么我心爱的 ReSharper 会呻吟呢?
我的一个 ASP.NET MVC控制器类中有一个简单的属性。
我以前见过很多次,所以要理解这个消息的含义,但通常它是完全有意义的。然而,事实并非如此。要到达带下划线的语句,User
必须不为空,所以检查User.Identity
是好的。
该Identity
属性是IPrincipal
接口的一部分,并返回一个继承的对象IIdentity
。
要继承此接口或任何与此相关的接口,此属性必须是引用类型,因此可能为 null,对吗?
那么为什么我心爱的 ReSharper 会呻吟呢?
你说你正在使用GenericPrinciple
as 的实现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 很聪明(而且是对的!)。