函数引用与Action <t> </t>的区别如何

时间:2014-03-28 12:10:55

标签: c# delegates

昨天我遇到了这种情况,它一直在啃着我。当编译器调用一个Action时,编译器不会抱怨对我的DoThis方法使用函数的引用,而我的理解是一个带有'void'返回类型的委托。

DoThis函数上的Action参数究竟发生了什么?

public class testit
{
    // Call DoThis with just a function reference. Should not work, but does.
    public void DoThisThing1() {
        DoThis(this.thing1);
    }

    // Call DoThis with an action.  This is correct.
    public void DoThisThing2() {
        DoThis(new Action<string, string>(this.thing2));
    }

    private void DoThis(Action<string, string> thing)
    {
        // Do some common things here.

        // Invoke Action
        thing.Invoke("1", "2");

        // Do other things.
    }

    private void thing1(string p1, string p2){}

    private void thing2(string p1, string p2){}
}

1 个答案:

答案 0 :(得分:7)

如果您的问题是有效的原因:

DoThis(this.thing1);

那是隐含的:

DoThis(new Action<string,string>(this.thing1));

(其中委托类型是从DoThis

的已解析方法签名推断出来的

简单地说:编译器为我们填写了一些东西 - 自C#2以来就存在的语法糖。在C#1.1中,它不会被编译。