爲什麼resharper在這種情況下顯示System.NullReferenceException
警告?爲什麼Resharper在這種情況下顯示System.NullReferenceException警告?
MethodBase.GetCurrentMethod().DeclaringType.Name
我在我的代碼中的許多地方有上述行。爲什麼Resharper會向我發出警告?
我查了一下SO的問題,但是沒有完全匹配。
爲什麼resharper在這種情況下顯示System.NullReferenceException
警告?爲什麼Resharper在這種情況下顯示System.NullReferenceException警告?
MethodBase.GetCurrentMethod().DeclaringType.Name
我在我的代碼中的許多地方有上述行。爲什麼Resharper會向我發出警告?
我查了一下SO的問題,但是沒有完全匹配。
你看到的是ReSharper's Annotation[CanBeNull]
的結果,即適用於財產MemberInfo.DeclaringType
:
(這是ReSharper的QuickDoc功能,按按Ctrl + Q或Ctrl + Shift + F1,取決於您使用的鍵綁定,屬性)。
我最近recorded a webinar與JetBrains公司,在深入discussnig註解,所以歡迎您觀看有關如何工作的詳細信息,但基本上,ReSharper的「知道」財產可以在運行時可能爲null 。這是因爲MemberInfo
實現中的任何一個都可能會從此屬性返回null。例如,ConstructorInfo
does this:
public override Type DeclaringType
{
get
{
return m_reflectedTypeCache.IsGlobal ? null : m_declaringType;
}
}
在任何情況下,因爲潛在的的實現方式之一可以是零,ReSharper的警告你這件事,所以你需要做一個空檢查。
由於GetCurrentMethod()可能會假定返回null,當它嘗試訪問.DeclaringType時,它會隨着您的錯誤而失敗。建議您運行GetCurrentMethod()並在訪問屬性之前以防禦方式檢查其結果。這是同爲DeclaringType和訪問Name屬性
的GetCurrentMethod
的簽名是:
public static System.Reflection.MethodBase GetCurrentMethod()
由於它的返回類型是引用類型,接着是獲得財產,R#能不知道方法GetCurrentMethod
是否返回null。你知道的。 R# - 不知道。
因爲GetCurrentMethod
或可能會返回null,並且您無法訪問空對象的屬性。
感謝您的詳細解釋。這有助於 – ckv
@ckv謝謝!如果您發現此答案有幫助,請將其標記爲已接受:)這就是StackOverflow的工作原理! –