从control.Invoke返回值(MethodInvoker)委托: 解释说明

4
#1和#2有什么区别:
代码1(编译成功):
        byte[] GetSomeBytes()
  {
            return (byte[])this.Invoke((MethodInvoker)delegate 
            { 
                GetBytes(); 
            });
  }

  byte[] GetBytes()
  {
   GetBytesForm gbf = new GetBytesForm();

   if(gbf.ShowDialog() == DialogResult.OK)
   {
    return gbf.Bytes;
   }
   else
    return null;
  }

代码2(未通过编译)

int GetCount()
{
       return (int)this.Invoke((MethodInvoker)delegate
       {
           return 3;            
       });
}

代码#2给我返回了"由于'System.Windows.Forms.MethodInvoker'返回void,因此return关键字后面不能跟随对象表达式"的错误信息。

我该如何修复它?为什么编译器认为代码#1是正确的?


我们能再加一点代码吗?“this”指向的是什么类型? - Matthew Abbott
2个回答

26
回答你的第一个问题,尝试像这样修改你的第一个示例:
return (byte[])this.Invoke((MethodInvoker)delegate 
{ 
    return GetBytes(); 
});

此时,您将遇到相同的编译错误。

public object Invoke(Delegate method) 返回一个对象,因此您可以将返回值转换为任何类型并进行编译。但是,您正在传递类型为 MethodInvoker 的委托,其签名为 delegate void MethodInvoker()。因此,在将其转换为 MethodInvoker 的方法体内,您无法 return 任何内容。

对于第二个问题,请尝试使用以下代码:

return (int)this.Invoke((Func<int>)delegate
{
    return 3;
});

"

Func<int> 是一个返回 int 的委托,所以它会被编译。

"

1
在代码#1中,您的委托不返回任何值 - 它只是执行GetBytes(),但不返回任何内容。编译器不会抱怨,因为它不期望返回值(这是一个void方法)。
然而,在代码#2中,您尝试从委托返回一个值 - 这是编译器抱怨的原因,因为您不能从void方法中返回一个值(在这种情况下是“3”)。

哦,我把两个返回值混淆了。我忘记在GetBytes();中添加return。 - Александр Д.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接