2012-07-19 91 views
0

爲什麼不此代碼編譯:Action委託作爲成員不編譯

public class FakeESBSingleMessage<T> : IBusEnabledClass 
{ 
    private Action<T> SubscribedAction { get; set; } 

    #region IBusEnabledClass 

    public void Publish<T>(T message) 
    { 
     SubscribedAction(message); 
    } 

    public void Subscribe<T>(string ID, Action<T> action) 
    { 
     SubscribedAction = action; 
    } 

    #endregion 
} 

它給出以下的錯誤:

錯誤37參數1:無法從「T [轉換.. FakeESBSingleMessage.cs(8)]'to'T'..FakeESBSingleMessage.cs 16 30
錯誤39無法將類型'System.Action [mscorlib.dll]'隱式轉換爲'System.Action [mscorlib.dll]'.. FakeESBSingleMessage.cs 21 32
錯誤36委託'System.Action'有一些無效的參數.. \ FakeESBSingleMessage.cs 16 13

我正在嘗試創建一個用於測試的假ESB組件,它保存在Subscribe上傳遞的委託,並在調用發佈時調用它。

回答

6

由於發佈和訂閱消息定義了新的類型參數T,而不是使用類中定義的參數,所以會出現編譯錯誤。試試這個:

public class FakeESBSingleMessage<T> : IBusEnabledClass 
{ 
    private Action<T> SubscribedAction { get; set; } 

    #region IBusEnabledClass 

    public void Publish(T message) 
    { 
     SubscribedAction(message); 
    } 

    public void Subscribe(string ID, Action<T> action) 
    { 
     SubscribedAction = action; 
    } 

    #endregion 
} 
+0

是的,這是問題,謝謝! – 79E09796 2012-08-02 08:56:32