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

6
为什么在这种情况下,Resharper会显示一个System.NullReferenceException警告?
MethodBase.GetCurrentMethod().DeclaringType.Name

我在我的代码中多处使用了以上这行代码。为什么Resharper会对我发出警告?

我在stackoverflow上搜索了类似的问题,但没有找到完全匹配的答案。


与 https://stackoverflow.com/questions/1799321/c-sharp-2-0-can-methodbase-getcurrentmethod-return-null 相关。 - riQQ
4个回答

7
你所看到的是 ReSharper注释 [CanBeNull] 的结果,它被应用于属性 MemberInfo.DeclaringType

这是ReSharper的QuickDoc功能,在属性上按下Ctrl+QCtrl+Shift+F1,具体取决于您使用的键绑定。

我最近与JetBrains一起录制了一个网络研讨会,深入讨论了注释,因此欢迎您观看以获取有关其工作原理的更多信息,但基本上,ReSharper“知道”DeclaringType属性在运行时可能为null。这是因为任何一个MemberInfo实现都可以从此属性返回null。例如,ConstructorInfo执行此操作

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

无论如何,由于DeclaringType的实现可能为空,因此ReSharper会对其进行警告,因此您需要进行空值检查。

感谢您提供这么详细的解释。这很有帮助。 - ckv
@ckv 谢谢!如果您觉得这个答案有帮助,请将其标记为已接受 :) 这就是 StackOverflow 的工作方式! - Igal Tabachnik

3

因为 GetCurrentMethod() 可能返回 null,当它尝试访问 .DeclaringType 时会导致错误。它建议您在访问属性之前防御性地运行 GetCurrentMethod() 并检查其结果。这也适用于 DeclaringType 和访问 Name 属性。


2
GetCurrentMethod 的签名如下: public static System.Reflection.MethodBase GetCurrentMethod() 由于它的返回类型是一个引用类型,后面跟着属性访问,因此R#无法知道方法 GetCurrentMethod 是否返回null。 您知道它,但 R# - 不知道。

2
因为GetCurrentMethodDeclaringType可能返回null,而你不能访问空对象的属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接