Может ли делегат иметь необязательный параметр?

У меня есть код ниже, который работал нормально, пока я не попытался добавитьbool NetworkAvailable = true часть. Теперь я получаюMethod name expected исключение времени компиляции в строке 4 ниже.

void NetworkStatus_AvailabilityChanged(object sender, NetworkStatusChangedArgs e)
{
   var networkAvailable = e.IsAvailable;
   SetUpdateHUDConnectedMode d = new SetUpdateHUDConnectedMode(UpdateHUDConnectedMode(networkAvailable));
   this.Invoke(d);
}   

delegate void SetUpdateHUDConnectedMode(bool NetworkAvailable = true);
private void UpdateHUDConnectedMode(bool NetworkAvailable = true)
{
   ...
}

По общему признанию, я новичок вDelegates а такжеOptional Parameters так что я был бы благодарен за любые идеи. Благодарю.

Ответы на вопрос(2)

 public delegate void Test(int a, int b = 0);

 static void T1(int a, int b) { }
 static void T2(int a, int b = 0) { }
 static void T3(int a) { }


    Test t1 = T1;
    Test t2 = T2;
    Test t3 = T3;   // Error

И тогда вы можете позвонить

    t1(1);
    t1(1, 2);
    t2(2);
    t2(2, 3);
 David Arno23 июн. 2015 г., 23:03
Не уверен, что это функция C # 5, но в вашем примере вы могли бы объявитьstatic void T2(int a, int b = 1) { } например, и это все равно не будет ошибки, покаt3, Похоже, что совпадения делегат / подпись просто работают на основе сопоставления необязательных параметров, а не значения по умолчанию.
 Softlion26 февр. 2013 г., 14:53
Работа в C # 2 тоже
Решение Вопроса


Когда вы создаете экземпляр делегата, указывающего на метод, вы не можете указать никаких параметров.

Вместо этого вам нужно передать значения параметров вInvoke метод, как это:

SetUpdateHUDConnectedMode d = UpdateHUDConnectedMode;
this.Invoke(d, e.IsAvailable);
 SLaks21 сент. 2010 г., 20:11
Заметьте, кстати, что вы также можете использовать встроенный универсальныйAction<bool> делегировать.
 Refracted Paladin21 сент. 2010 г., 20:10
Я тоже так думал. Я рад, что я на правильном пути, какdelegates оказываются не такими уж и плохими, как я думал.
 SLaks21 сент. 2010 г., 20:04
Да; делегатопределение должен определить, какие параметры принимает делегат. Тип делегата определяет сигнатуру функции, которой должны соответствовать методы в делегате.
 Refracted Paladin21 сент. 2010 г., 20:29
Таким образом, для WinForms это в некоторой степени побеждает точку необязательных параметров?
 Refracted Paladin21 сент. 2010 г., 20:20
Я должен буду прочитать об общих делегатах, поскольку я не использовал их. Спасибо за предложение, хотя.
 SLaks21 сент. 2010 г., 20:26
WinFormsInvoke Метод не знает о дополнительных параметрах. Поэтому вам нужно передать каждый параметрInvoke, Сам делегат знает о необязательных параметрах, поэтому вы можете (но не хотите) писатьd(); без параметров.
 Refracted Paladin21 сент. 2010 г., 20:22
Что-то вроде дополнительного вопроса, но нужно ли мне сейчас включать параметр в мой вызов Invoke? Этот код в другом месте теперь генерирует исключение во время выполнения.this.Invoke(d);
 Refracted Paladin21 сент. 2010 г., 20:00
Спасибо, похоже, у моего делегата тоже должен быть объявлен параметр, например: -> `делегат void SetUpdateHUDConnectedMode (bool NetworkAvailable = true); `правильно? Я предполагаю, что так как он не будет компилироваться иначе, но ...

Ваш ответ на вопрос