C#委托可以指向另一个类/对象的方法吗?

时间:2020-03-10 12:47:21

标签: c# function class methods delegates

在这里,我希望获得一个类似于函数指针的委托,以指向另一个类(名为Inner)中的类方法,然后将其传递给静态函数,如下所示:

public class Inner
{
    public int M = 3;
    public void F() { Console.WriteLine("f"); }
    public void G() { Console.WriteLine("g"); }
}
class Program
{
    public static void Caller(Action a)
    {
        a();
    }
    static void Main(string[] args)
    {
        var i = new Inner();
        var f = i.F;
        var g = i.G;
        f();//error
        g();//error
        Program.Caller(f);
        Console.WriteLine("Hello World!");
    }
}

我来自c / c ++,在c / c ++中,这样的函数指针非常简单,但是此C#代码无法编译。我在Google上搜索后发现,几乎所有有关委托的说明都指向其内部指向类方法的委托。

我的问题是,如何修复代码以使其正常工作?

2 个答案:

答案 0 :(得分:2)

Coding Seb's answer突出显示了问题的原因,但并没有真正解释原因。

这是因为Inner是方法组,而不是特定的方法指针。例如,假设public class Inner { public void F() { Console.WriteLine("f"); } public void F(string name) { Console.WriteLine(name); } } 的定义如下:

i.F

F()会引用哪种方法? F(string)还是Action f = i.F;

因此,您需要显式定义变量类型或强制转换指针:

var f = (Action)i.F;

或者:

/

答案 1 :(得分:1)

您无法在C#中的隐式变量中设置方法组,因此,如果您仅在var中更改2 Action,则可以正常工作

public class Inner
{
    public int M = 3;
    public void F() { Console.WriteLine("f"); }
    public void G() { Console.WriteLine("g"); }
}
class Program
{
    public static void Caller(Action a)
    {
        a();
    }
    static void Main(string[] args)
    {
        var i = new Inner();
        Action f = i.F;
        Action g = i.G;
        f();
        g();
        Program.Caller(f);
        Console.WriteLine("Hello World!");
    }
}