为什么 Resharper 会在这种情况下显示System.NullReferenceException
警告?
MethodBase.GetCurrentMethod().DeclaringType.Name
我在我的代码中的许多地方都有上述行。为什么Resharper会给我一个警告?
我在类似的行上检查了SO,但没有完全匹配。
答案 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)
因为GetCurrentMethod
或DeclaringType
都可以返回null,并且您无法访问null对象的属性。