возвращаемое значение из control.Invoke ((MethodInvoker) делегат {/ * ... * /}; мне нужны некоторые пояснения - PullRequest
3 голосов
/ 25 июня 2010

В чем разница между № 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 верным?

Ответы [ 2 ]

24 голосов
/ 25 июня 2010

Чтобы ответить на ваш первый вопрос, попробуйте изменить свой первый образец следующим образом:

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 голос
/ 25 июня 2010

В коде № 1 ваш делегат не возвращает значение - он просто выполняет GetBytes (), но ничего не возвращает.Компилятор не будет жаловаться, потому что он не ожидает возвращаемого значения (это пустой метод).

Однако в коде № 2 вы пытаетесь вернуть значение из делегата - на что жалуется компилятор,потому что вы не можете вернуть значение (в данном случае '3') из метода void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...