2010-09-21 22 views
9

Mam poniższy kod, który działał poprawnie, dopóki nie spróbowałem dodać części bool NetworkAvailable = true. Teraz otrzymuję wyjątek czasu kompilacji Method name expected w linii 4 poniżej.Czy delegat może mieć parametr opcjonalny?

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) 
{ 
    ... 
} 

Jestem wprawdzie nowy do Delegates i Optional Parameters więc byłbym wdzięczny za wszelkie wglądu. Dzięki.

Odpowiedz

5

Delegat wskazuje na definicję metody.
Po utworzeniu delegata wskazującego metodę nie można podać żadnych parametrów.

Zamiast tego trzeba przekazać wartości parametrów metody Invoke coś takiego:

SetUpdateHUDConnectedMode d = UpdateHUDConnectedMode; 
this.Invoke(d, e.IsAvailable); 
+2

Dzięki, wygląda mój pełnomocnik musi mieć parametr zadeklarowane jako dobrze, jak ten -> 'delegat void SetUpdateHUDConnectedMode (bool NetworkAvailable = true); ', prawda? Zakładam, że tak, ponieważ nie będzie kompilacji w inny sposób, ale ... –

+1

Tak; delegat _definition_ musi zdefiniować parametry, które przyjmuje delegat. Typ delegata definiuje podpis funkcji, który musi być zgodny z metodami w delegacie. – SLaks

+0

Tak też myślałem. Cieszę się, że jestem na dobrej drodze, ponieważ "delegaci" okazują się nie tak, jak sądziłem. –

23

W pewnym bardzo ograniczonym zakresie. Korzystanie z C# 4:

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 

a następnie można nazwać

t1(1); 
    t1(1, 2); 
    t2(2); 
    t2(2, 3); 
+2

Praca w C# 2 zbyt – Softlion

+0

Nie jestem pewien, czy jest to funkcja C# 5, ale w twoim przykładzie możesz na przykład zadeklarować 'static void T2 (int a, int b = 1) {}', ale nadal nie będzie błędu do 't3'. Wygląda na to, że dopasowania delegatów/podpisów działają po prostu na podstawie dopasowania opcjonalnych parametrów, a nie wartości domyślnej. –

Powiązane problemy