2010-09-21 5 views
9

Ich habe den folgenden Code, der gut funktionierte, bis ich versuchte, den bool NetworkAvailable = true Teil hinzuzufügen. Jetzt bekomme ich eine Method name expected Kompilierungszeit Ausnahme in Zeile 4 unten.Kann ein Delegierter einen optionalen Parameter haben?

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

Ich bin zugegebenermaßen neu Delegates und Optional Parameters so würde ich für jede Einsicht dankbar. Vielen Dank.

Antwort

5

Ein Delegat verweist auf eine Methodendefinition.
Wenn Sie einen Delegaten instanziieren, der auf eine Methode verweist, können Sie keine Parameter angeben.

Stattdessen müssen Sie die Parameterwerte an die Invoke Methode zu übergeben, wie folgt aus:

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

Dank nennen, es sieht aus wie mein Delegat der Parameter erklärt auch, wie diese haben braucht -> 'delegate void SetUpdateHUDConnectedMode (bool NetworkAvailable = wahr); ', richtig? Ich gehe davon aus, da es den anderen Weg nicht kompiliert, aber ... –

+1

Ja; Der Delegat _definition_ muss definieren, welche Parameter der Delegat verwendet. Ein Delegattyp definiert eine Funktionssignatur, der die Methode (n) im Delegaten entsprechen müssen. – SLaks

+0

Das dachte ich auch. Ich bin froh, dass ich auf dem richtigen Weg bin, denn die "Delegierten" erweisen sich als nicht so schlimm, wie ich dachte. –

23

Gewisser sehr begrenzt. Mit 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 

Und dann können Sie

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

Arbeite auch in C# 2 – Softlion

+0

Nicht sicher, ob dies ein C# 5 Feature ist, aber in deinem Beispiel könntest du 'static void T2 (int a, int b = 1) {}' zum Beispiel deklarieren und es wird immernoch kein Fehler sein bis "t3". Es sieht so aus, als würden Delegate/Signature-Übereinstimmungen einfach auf der Grundlage von passenden optionalen Parametern und nicht dem Standardwert funktionieren. –