3

下面是我在 c# 中的代码...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        TestPointer test = new TestPointer();
        test.function1(function2);   // Error here: The name 'function2' does not exist in     current context
    }
}

class TestPointer
{
    private delegate void fPointer(); // point to every functions that it has void as return value and with no input parameter 
    public void function1(fPointer ftr)
    {
        fPointer point = new fPointer(ftr);
        point();
    }

    public void function2()
    {
        Console.WriteLine("Bla");
    }
}

如何通过在主函数中传递函数引用来调用回调函数?...我是 C# 新手

4

4 回答 4

3

test.function1(test.function2)应该这样做。

你还需要

public delegate void fPointer();

代替

private delegate void fPointer();
于 2012-09-18T11:02:15.623 回答
1

你可以用一个动作来做到这一点:

class Program
    {
        static void Main(string[] args)
        {
            TestPointer test = new TestPointer();
            test.function1(() => test.function2());   // Error here: The name 'function2' does not exist in     current context

            Console.ReadLine();
        }
    }

    class TestPointer
    {
        private delegate void fPointer(); // point to every functions that it has void as return value and with no input parameter 
        public void function1(Action ftr)
        {
            ftr();
        }

        public void function2()
        {
            Console.WriteLine("Bla");
        }
    }
于 2012-09-18T11:04:32.467 回答
1

您的代码有两个问题:

    TestPointer test = new TestPointer();
    test.function1(function2);   

在这里,范围内没有调用变量function2。你想要做的是这样称呼它:

    test.function1(test.function2);   

test.function2实际上是一个方法组,在这种情况下,编译器会将其转换为委托。进入下一个问题:

private delegate void fPointer(); 
public void function1(fPointer ftr)

您将委托声明为私有。它应该是公开的。委托是一种特殊的类型,但它仍然是一种类型(您可以声明 'em 的变量,这正是您在声明参数时所做的function1)。当声明为私有时,该类型在类外部不可见TestPointer,因此不能用作公共方法的参数。

最后,这并不是真正的错误,但可以简化调用委托的方式:

    ftr();

所以这里是你更正的代码:

using System;

class Program
{
    static void Main(string[] args)
    {
        TestPointer test = new TestPointer();
        test.function1(test.function2);   
    }
}

class TestPointer
{
    public delegate void fPointer(); 
    public void function1(fPointer ftr)
    {
        ftr();
    }

    public void function2()
    {
        Console.WriteLine("Bla");
    }
}
于 2012-09-18T11:16:56.147 回答
0

你需要做function2 static或通过text.function2

于 2012-09-18T11:02:49.520 回答