2013-03-09 40 views
2

我因爲聽了一些系統類與ILSpy,當我遇到這種來自於System.Internal.HandleCollector類:微軟內部屬性 - 此屬性沒有二傳手

internal sealed class HandleCollector 
{   
    ... bunch of stuff removed ... 

    internal static event HandleChangeEventHandler HandleAdded 
    { 
     [MethodImpl(MethodImplOptions.Synchronized)] 
     add 
     { 
      HandleCollector.HandleAdded = (HandleChangeEventHandler)Delegate.Combine(HandleCollector.HandleAdded, value); 
     } 
     [MethodImpl(MethodImplOptions.Synchronized)] 
     remove 
     { 
      HandleCollector.HandleAdded = (HandleChangeEventHandler)Delegate.Remove(HandleCollector.HandleAdded, value); 
     } 
    } 
    ... bunch of stuff removed ... 
} 

它怎麼說,微軟可以編譯這個時VisualStudio抱怨(我複製了該類)該屬性沒有setter?有人可以分解爲什麼這個作品,但我的VS副本抱怨(建立標誌?)?

這家酒店沒有一個二傳手

的錯誤是在每個HandleCollector.HandleAdded =語句。

+2

這不是一個屬性;這是一個'事件'。因此它不需要'get''和'set'訪問器。 – stakx 2013-03-09 19:48:55

+0

那麼爲什麼VS抱怨 – 2013-03-09 19:49:17

+3

ILSpy和其他工具經常不得不努力代表一些不直接映射到語言的東西... – 2013-03-09 20:06:09

回答

5

我們不需要猜測MS源代碼是什麼,因爲它是可用here

這是HandleAdded從HandleCollector.cs聲明:

internal static event HandleChangeEventHandler HandleAdded; 

這是一個自動實現的事件。問題在於ILSpy的反編譯。也許你應該提交一個bug。

+0

這正是我所得到的,至少在ILSpy 2.1.0.1603和.NET 4.0中 – 2013-03-09 20:23:09

0

如果您希望它使用賦值int來編譯添加和刪除實現,則需要使用字段。

像這樣:

internal sealed class HandleCollector 
{ 
    private static HandleChangeEventHandler HandleAddedField; 

    internal static event HandleChangeEventHandler HandleAdded 
    { 
     [MethodImpl(MethodImplOptions.Synchronized)] 
     add 
     { 
      HandleCollector.HandleAddedField = (HandleChangeEventHandler)Delegate.Combine(HandleCollector.HandleAddedField, value); 
     } 
     [MethodImpl(MethodImplOptions.Synchronized)] 
     remove 
     { 
      HandleCollector.HandleAddedField = (HandleChangeEventHandler)Delegate.Remove(HandleCollector.HandleAddedField, value); 
     } 
    } 
} 
+0

謝謝Jens,但這是微軟的代碼 - 你可以建議他們......無論如何,我們認爲它是反饋給我發佈代碼的錯誤反彙編程序。 – 2013-03-09 20:14:29

+0

@Chuck,實際上當我使用ILSpy的時候,我得到的是這個'內部靜態事件HandleChangeEventHandler HandleAdded;'這可能是ILSpy的一個bug。 – 2013-03-09 20:18:39

+0

@ChuckSavage:不,它不是微軟的代碼。它是爲Microsoft程序集(包含CIL字節碼)生成的ILSpy生成的C#代碼。而且從字節碼到C#的翻譯一定會出錯。 – stakx 2013-03-09 20:20:36

0

讓我們從代碼剝離一些非重要比特:

event HandleChangeEventHandler HandleAdded 
{ 
    add 
    { 
     HandleAdded = (HandleChangeEventHandler)Delegate.Combine(HandleAdded, value); 
    } 
    remove 
    { 
     HandleAdded = (HandleChangeEventHandler)Delegate.Remove(HandleAdded, value); 
    } 
} 

這是不正確的C#代碼。通常,這個事件必須有一個後備代表。分配到事件HandleAdded使大約多大意義,因爲這:

int Foo 
{ 
    set 
    { 
     Foo = value; 
    } 
} 

所以我猜想,ILSpy已簡單地生產不正確的C#代碼。基本上HandleAdded只是一個沒有任何特殊訪問器的正常事件。如果你使用JustDecompile查看同一個事件,這就是您將看到的—根本沒有自定義存取器方法!

爲了得到這個編譯,嘗試添加一個後盾委託和更換任務目標:

event HandleChangeEventHandler HandleAdded 
{ 
    add 
    { 
     handleAdded = (HandleChangeEventHandler)Delegate.Combine(handleAdded, value); 
    }//^             ^
    remove 
    { 
     handleAdded = (HandleChangeEventHandler)Delegate.Remove(handleAdded, value); 
    }//^             ^
} 
HandleChangeEventHandler handleAdded; // <--