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

C# C委托是否可以指向另一个类/对象的方法?,c#,function,class,methods,delegates,C#,Function,Class,Methods,Delegates,在这里,我希望获得一个类似委托的函数指针,指向另一个名为internal的类中的类方法,然后将其传递给静态函数,如下所示: 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(A

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

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代码无法编译。我在谷歌上搜索发现,几乎所有的委托解释都是关于指向其内部类方法的委托的


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

您不能在C中的隐式变量中设置methods group,因此,如果您只是在操作中更改2个变量,它就工作了

公共阶级内部 { 公共int M=3; public void F{Console.WriteLinef;} public void G{Console.WriteLineg;} } 班级计划 { 公共静态无效调用 { A. } 静态环[]args { var i=新的内部变量; 作用f=i.f; 动作g=i.g; F G 程序调用方; Console.WriteLineHello World!; } }
您不能在C中的隐式变量中设置methods group,所以,若您只是在实际操作中更改了2var,它就可以工作了

公共阶级内部 { 公共int M=3; public void F{Console.WriteLinef;} public void G{Console.WriteLineg;} } 班级计划 { 公共静态无效调用 { A. } 静态环[]args { var i=新的内部变量; 作用f=i.f; 动作g=i.g; F G 程序调用方; Console.WriteLineHello World!; } } highlight是问题的原因,但没有真正解释原因

这是因为i.F是一个方法组,而不是一个特定的方法指针。例如,imagine Inner的定义如下:

public class Inner
{
    public void F() { Console.WriteLine("f"); }
    public void F(string name) { Console.WriteLine(name); }
}
i.F.会参考哪种方法?F还是F字符串

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

Action f = i.F;
或:

highlight是问题的原因,但没有真正解释原因

这是因为i.F是一个方法组,而不是一个特定的方法指针。例如,imagine Inner的定义如下:

public class Inner
{
    public void F() { Console.WriteLine("f"); }
    public void F(string name) { Console.WriteLine(name); }
}
i.F.会参考哪种方法?F还是F字符串

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

Action f = i.F;
或:


到目前为止,答案是可行的,但是如果要在更大的上下文中使用,您可能需要阅读依赖注入。Unity是.Net中最常用的框架之一。到目前为止,答案是可行的,但是如果要在更大的环境中使用,您可能需要阅读依赖注入。Unity是.Net中最常用的框架之一。