为什么Resharper在这种情况下会显示System.NullReferenceException警告?

时间:2014-04-02 10:51:34

标签: c# resharper

为什么 Resharper 会在这种情况下显示System.NullReferenceException警告?

MethodBase.GetCurrentMethod().DeclaringType.Name

我在我的代码中的许多地方都有上述行。为什么Resharper会给我一个警告?

我在类似的行上检查了SO,但没有完全匹配。

4 个答案:

答案 0 :(得分:7)

您所看到的是ReSharper's Annotation [CanBeNull]的结果,该结果适用于属性MemberInfo.DeclaringType

(这是ReSharper的QuickDoc功能,按 Ctrl + Q Ctrl + Shift + F1 ,取决于您使用的键绑定,在属性上。)

我最近与JetBrains一起recorded a webinar,深入讨论了注释,所以欢迎您观看它以获取有关其工作原理的更多信息,但基本上,ReSharper"知道" DeclaringType属性 在运行时可能为空。这是因为任何一个MemberInfo实现都可能从此属性返回null。例如,ConstructorInfo does this

public override Type DeclaringType 
{ 
    get 
    { 
        return m_reflectedTypeCache.IsGlobal ? null : m_declaringType; 
    }
}

无论如何,由于可能是DeclaringType的其中一个实现可能为null,ReSharper会向您发出警告,因此您需要进行空检查。

答案 1 :(得分:3)

因为GetCurrentMethod()可以假设返回null,并且当它试图访问.DeclaringType时它会因你的错误而失败。它建议你运行GetCurrentMethod()并在访问该属性之前以防御性方式检查其结果。这与DeclaringType和访问Name属性

相同

答案 2 :(得分:2)

GetCurrentMethod的签名是:

public static System.Reflection.MethodBase GetCurrentMethod()

由于它的返回类型是引用类型,后面是对属性的访问,因此R#无法知道方法GetCurrentMethod是否返回null。你知道的。 R# - 不知道。

答案 3 :(得分:2)

因为GetCurrentMethodDeclaringType都可以返回null,并且您无法访问null对象的属性。