2012-07-19 89 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