2011-04-21 74 views
7

ReSharper的告訴我,MemberInfo.DeclaringType不能爲空: enter image description here奇怪ReSharper的警告上MemberInfo.DeclaringType

但是在運行該代碼時,文本「頂級成員」被打印出來。我不明白,這裏有什麼問題?

+0

你做了一個完整的清理和重建?經常resharper提出奇怪的警告,因爲它最近沒有重新運行它的分析。否則,它可能只是一個錯誤。 – captncraig 2011-04-21 17:07:25

+0

@CMP,jep我做到了。我覺得這很奇怪,因爲諸如NotNullAttribute這樣的屬性會自動分配給標準庫。如果該代碼中存在錯誤,那麼以前必須注意到該錯誤。 – JBSnorro 2011-04-21 17:09:23

+0

我是指resharper的靜態分析引擎中的一個bug。 – captncraig 2011-04-21 17:13:15

回答

6

Resharper在這裏根本就是錯誤的。 MemberInfoabstract類型,它是可能的任意實施返回任何它爲所欲爲包括null

例子:

class EvilMemberInfo : MemberInfo 
{ 
    public override System.Type DeclaringType 
    { 
     get { return null; } 
    } 

    // Rest omitted for brevity 
} 
+0

這正是覆蓋System.Type用於DeclaringType。也許他們應該稱之爲EvilType。 =] – rsbarro 2011-04-21 17:14:11

+0

我最近聲稱在Resharper中發現了一個錯誤,但事實證明我錯了。但是這一次,我說我的問題不那麼激進,但我同意你的看法。 – JBSnorro 2011-04-21 17:14:38

+0

@rsbarro,不!這不完全是System.Type的覆蓋,因爲類型可以嵌套.... – JBSnorro 2011-04-21 17:15:11

10

微軟代碼契約規定,這是從來沒有空。

// System.Reflection.MemberInfo 
public virtual Type DeclaringType 
{ 
    get 
    { 
     Contract.Ensures(Contract.Result<Type>() != null, null, "Contract.Result<Type>() != null"); 
     Type result; 
     return result; 
    } 
} 

因此,ReSharper依賴代碼合同。

+0

好的,我已經將它發佈在代碼合同論壇上,http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/fdf1436a-e843-408c -b932-c012e03e72cd – JBSnorro 2011-04-22 10:37:43