函数引用与动作引用有何不同?

本文关键字:引用 何不同 函数 | 更新日期: 2023-09-27 17:54:41

我昨天遇到了这种情况,一直困扰着我。当我的DoThis方法调用一个Action时,编译器不会抱怨使用对函数的引用,在我看来,这个Action是一个带有'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){}
}

函数引用与动作引用有何不同?

如果你的问题是为什么这样做:

DoThis(this.thing1);

那么这就是隐含的:

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

(委托类型是从DoThis的解析方法签名中推断出来的)

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