C#:我可以将一个显式委托转换为Action委托吗?

Dan*_*nor 4 c# lambda delegates

鉴于:

delegate void Explicit();
Run Code Online (Sandbox Code Playgroud)

我可以吗:

public void Test(Explicit d)
{
    Action a;
    a = d; // ????
}
Run Code Online (Sandbox Code Playgroud)

我有一个场景,我需要重载具有以下内容的构造函数:

public MyClass(Expression<Action> a) {}
Run Code Online (Sandbox Code Playgroud)

但是下面的重载是模棱两可的:

public MyClass(Action a) {}
Run Code Online (Sandbox Code Playgroud)

我认为使用显式委托可以解决歧义但我需要将该显式委托强制转换为动作以利用现有代码.

Yur*_*ich 12

Action a = new Action(d);
Run Code Online (Sandbox Code Playgroud)

  • 虽然这有效,但应该注意它实际上创建了一个引用`d.Invoke`的新委托实例.如果你继续这样做,委托链将会增长,并且每次调用这样的委托将导致一系列虚拟的`Invoke`调用,因此存在一定的性能(不是你可能在实践中遇到这个问题) ). (6认同)

Jar*_*Par 8

不,你不能在彼此之间使用匹配的签名来构建不同的委托类型.您必须创建目标类型的新委托/ lambda表达式并转发到原始表达式.

  • 此功能在2006年被要求并被拒绝.http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=159810 (6认同)