Скобки называются списком параметров анонимного метода и в этом случае пустые. У анонимного метода нет типа - компилятор пытается выполнить неявное преобразование. Если дана подпись анонимного метода, она должна соответствовать подписи делегата.
Неявное преобразование также возможно, если выполняются все следующие условия:
- Формальный список параметров делегата опущен
- У делегата нет выходных параметров
- Возвращаемые типы совпадают
Это случай в вашем втором примере. Так что нет никакой разницы между этими двумя строками - обе делают одно и то же. Вот еще один пример:
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 # для более подробной информации и примеров.