2010-09-21 19 views
9

Ho il codice seguente che funzionava bene fino a quando non ho provato ad aggiungere la porzione bool NetworkAvailable = true. Ora ricevo un'eccezione di compilazione Method name expected alla riga 4 di seguito.Un delegato può avere un parametro opzionale?

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

Io sono, è vero, una novità per Delegates e Optional Parameters così sarei grato per qualsiasi comprensione. Grazie.

risposta

5

Un delegato punta a una definizione di metodo.
Quando si crea un'istanza di un delegato che punta a un metodo, non è possibile specificare alcun parametro.

Invece, è necessario passare i valori dei parametri al metodo Invoke, in questo modo:

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

Grazie, sembra che mio delegato deve avere il parametro dichiarato come bene, come questo -> 'delegato vuoto SetUpdateHUDConnectedMode (bool NetworkAvailable = vero); ', corretto? Sto assumendo così poiché non compilerà l'altro modo ma ... –

+1

Sì; il delegato _definizione_ deve definire quali parametri assume il delegato. Un tipo delegato definisce una firma di funzione che il metodo (i) nel delegato deve corrispondere. – SLaks

+0

Questo è quello che ho pensato anch'io. Sono contento di essere sulla buona strada dato che i "delegati" si stanno rivelando non proprio brutti come pensavo. –

23

In una certa misura molto limitata. Usando 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 

E poi si può chiamare

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

Lavoro anche in C# 2 – Softlion

+0

Non sono sicuro se questa è una caratteristica del C# 5, ma nel tuo esempio potresti dichiarare 'static void T2 (int a, int b = 1) {}' per esempio e non sarà ancora un errore fino a quando 't3'. Sembra che le corrispondenze delegato/firma funzionino semplicemente sulla base dei parametri opzionali corrispondenti, piuttosto che del valore predefinito. –

Problemi correlati