在这里,我希望获得一个类似于函数指针的委托,以指向另一个类(名为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上搜索后发现,几乎所有有关委托的说明都指向其内部指向类方法的委托。
我的问题是,如何修复代码以使其正常工作?
答案 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!");
}
}