Какой правильный синтаксис для этого использования MethodInvoker? - PullRequest
3 голосов
/ 18 сентября 2010

Следующий код компилируется и работает нормально.

void myInvokedMethod(string s)
{
    Console.WriteLine(s);
}

void myInvoker()
{
    Invoke(new MethodInvoker(delegate() { myInvokedMethod("one"); }));
    Invoke(new MethodInvoker(delegate   { myInvokedMethod("two"); }));
}

Когда я звоню myInvoker , оба звонка на myInvokedMethod проходят. Что означают скобки после делегат и почему они кажутся необязательными?

Ответы [ 2 ]

3 голосов
/ 18 сентября 2010

Скобки называются списком параметров анонимного метода и в этом случае пустые. У анонимного метода нет типа - компилятор пытается выполнить неявное преобразование. Если дана подпись анонимного метода, она должна соответствовать подписи делегата.

Неявное преобразование также возможно, если выполняются все следующие условия:

  • Формальный список параметров делегата опущен
  • У делегата нет выходных параметров
  • Возвращаемые типы совпадают

Это случай в вашем втором примере. Так что нет никакой разницы между этими двумя строками - обе делают одно и то же. Вот еще один пример:

var x1 = new ParameterizedThreadStart(delegate(object o) {}); // Compiles.
var x2 = new ParameterizedThreadStart(delegate {});           // Compiles.
var x3 = new ParameterizedThreadStart(delegate() {});         // Does not compile.

Последние два примера показывают, что delegate(){} и delegate{} вообще не эквивалентны. Они эквивалентны только в вашем случае, потому что MethodInvoker не принимает параметров. См. Раздел 21 спецификации C # для более подробной информации и примеров.

3 голосов
/ 18 сентября 2010

Они задают формальные параметры, которые принимает анонимный метод , и являются необязательными, если они не принимают ничего.Если он объявлен без списка параметров, его можно назначить типу делегата, который принимает параметры.

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