C# 函数引用与操作有何不同<;T>;

C# 函数引用与操作有何不同<;T>;,c#,delegates,C#,Delegates,我昨天遇到这种情况,它一直在折磨我。编译器不会抱怨在我的dot方法中使用对函数的引用,当它调用一个据我理解是具有“void”返回类型的委托的操作时 DoThis函数上的这个动作参数到底是怎么回事 public class testit { // Call DoThis with just a function reference. Should not work, but does. public void DoThisThing1() { DoThis(this

我昨天遇到这种情况,它一直在折磨我。编译器不会抱怨在我的dot方法中使用对函数的引用,当它调用一个据我理解是具有“void”返回类型的委托的操作时

DoThis函数上的这个动作参数到底是怎么回事

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){}
}
公共类测试
{
//调用仅使用函数引用完成此操作。不应该工作,但确实可以。
public void dothing1(){
做这件事(这件事1);
}
//通过一个动作调用DoThis。这是正确的。
public void dothing2(){
这(新动作(这件事2));
}
私人的虚空(行动的东西)
{
//在这里做一些普通的事情。
//调用操作
事物。调用(“1”、“2”);
//做其他事情。
}
私有无效内容1(字符串p1,字符串p2){}
私有无效内容2(字符串p1,字符串p2){}
}

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

DoThis(this.thing1);
那么这就意味着:

DoThis(new Action<string,string>(this.thing1));
DoThis(新动作(this.thing1));
(其中委托类型是从
的解析方法签名推断出来的,这是


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

问题是什么?顺便说一句,C#中没有“函数引用”这样的东西
thing1
是一个方法组。我不确定如何称呼“方法组”对不起。为了澄清,我想知道为什么使用方法组而不是操作不会给我编译器错误或警告。谢谢!这就是我要找的。我没想到编译器会在不通知您的情况下如此随意地更改代码。我觉得DoThis(this.thing1)应该是一个编译器错误,因为我把它称为错误。我希望这至少会出现在编译器警告中。再次感谢@Jpirok它没有改变任何东西-它添加了一些完全不含糊的东西,只是噪音。@Jpirok:你没有说它错,也没有含糊不清的地方。庆幸的是,它少了几次击键。听起来不错,所以我调用DoThis的两种方法都是正确的,编译器通过允许我推断我希望给定的方法组是一个动作,为我提供了一种编写更干净代码的方法。再次感谢!