日期:2014-05-18  浏览次数:20778 次

一道题目大家都选B,我有点疑惑,大家解释下(欢迎高手)
声明一个委托public delegate int myCallBack(int x); 则用该委托产生的回调方法的原型应该是( )。  

a)void myCallBack(int x) ;  
b)int receive(int num) ;  
c)string receive(int x)  
 请问什么是“委托产生的回调方法的原型”?

------------
看了网上的解释,都选B,说是因为myCallBack(int x);里面参数是INT型的,所以就是B了

但是,问题来了,我记得以前的一个例子
C# code

public delegate void ScoreChangeEventHandler(int newscore, ref bool cancel);
最后调这个委托时时这样的

 //定义事件的类
    public class referee
    {
        public referee(Game game)
        {
            game.ScoreChange+=new ScoreChangeEventHandler(game_ScoreChange);
        }
        private void game_ScoreChange(int newscore,ref bool cancel)
        {
            if(newscore<100)
            {
                System.Console.WriteLine("good");
            }
            else
            {
                 System.Console.WriteLine("bad");
            }
        }
        
        
    }

显然game_ScoreChange是VOID类型的,而不是参数类型(又是INT ,有是 ref bool)

 

所以我觉得上面的A,B,C都是正确的,不知道大家怎么看的,希望高手指正

------解决方案--------------------
public delegate int myCallBack(int x);
则该委托产生的回调方法的原型必须满足:
1)返回类型与delegate一致
2)参数类型,顺序,个数必须与delegate一致
方法的名称不用管了....
因此必须为 int FunName(int param1);

------解决方案--------------------
看了网上的解释,都选B,说是因为myCallBack(int x);里面参数是INT型的,所以就是B了 
=============================
不是里面,是返回值
------解决方案--------------------
b)int receive(int num) ;

------解决方案--------------------
就是选B,myCallBack指向的函数必须满足相同的返回类型,参数列表类型,这个函数也就是被myCallBack回调的函数了,
------解决方案--------------------
探讨
引用:
b)int receive(int num) ;

这里的INT后委托的前一个INT对应就可以了是吗?

------解决方案--------------------
所以返回类型是INT型,所以选B呀
------解决方案--------------------
参数和返回类型必须一致
------解决方案--------------------
B)
没看明白你的例子说明了什么?你的例子中方法是这样声明的:
 private void game_ScoreChange(int newscore,ref bool cancel)
void返回类型,两个参数分别是int和ref bool
而定义的委托也是一样,void返回类型,两个参数int和ref bool。所以你的例子正好说明了:委托类型的赋值必须完全符合:
返回类型和签名的定义。


------解决方案--------------------
deletegate和方法的参数类型,参数方法和返回类型都一样就可以了
------解决方案--------------------
探讨
public delegate void ActionHandler(string args);
private void button1_Click(object sender, System.EventArgs e)
{
Form2 form=new Form2 ();
form.OnTextChange+=new ActionHandler(form_OnTextChange);
form.Show();
}
//调用一个函数
private void form_OnTextChange(string args)
{
this.textBox1.Text=args;
}
调用的时候form_OnTextChange怎么是VOID类型的.而不是 string 的