逆变参数?

时间:2010-12-20 12:00:38

标签: c# lambda delegates c#-4.0 contravariance

这可能是一个愚蠢的问题但是,我有一个方法,我用来使页面的语法更容易阅读

    public void Do(Delegate method, DispatcherPriority priority = DispatcherPriority.Normal)
    {
        this.Window.Dispatcher.BeginInvoke(method, DispatcherPriority.Background);
    }

然后我可以写

        Do(new Action(() =>
        {
            //DoStuff()
        }));

但是,我想将Action移动到Do方法中,这样我可以写更多简单:

        Do(() =>
        {
            //DoStuff()
        }));

但我有点肯定如何编写逆变参数来做Do方法?

1 个答案:

答案 0 :(得分:4)

Lambda是无类型的,所以这是不可能的。

如果你不关心方法参数,那么为什么不将方法签名更改为:

public void Do(Action method,
               DispatcherPriority priority = DispatcherPriority.Normal)

然后,第二个示例将正常工作,因为编译器将能够隐式地将lambda转换为Action

如果你真的想接受一个任何委托类型的实例,它代表一个不带参数的方法,你就必须坚持你现在拥有的东西。