2010-09-21 35 views
9

Tengo el siguiente código que funcionaba bien hasta que intenté agregar la parte bool NetworkAvailable = true. Ahora recibo una excepción de tiempo de compilación Method name expected en la línea 4 a continuación.¿Puede un delegado tener un parámetro opcional?

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

soy, ciertamente, nuevo a Delegates y Optional Parameters así que agradecería cualquier penetración. Gracias.

Respuesta

5

Un delegado señala una definición de método.
Cuando crea una instancia de un delegado que apunta a un método, no puede especificar ningún parámetro.

En su lugar, usted necesita para pasar los valores de los parámetros para el método Invoke, así:

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

Gracias, parece que mi delegado tiene que tener el parámetro declarado así, como este -> 'delegado vacío SetUpdateHUDConnectedMode (bool NetworkAvailable = verdadero); ', ¿correcto? Asumo que sí, ya que no se compilará de otra manera, pero ... –

+1

Sí; el delegado _definition_ debe definir qué parámetros toma el delegado. Un tipo de delegado define una firma de función que el método (s) en el delegado debe coincidir. – SLaks

+0

Eso es lo que yo también pensé. Me alegro de estar en el camino correcto ya que los "delegados" están resultando ser tan malos como yo pensaba. –

23

Hasta cierto punto muy limitado. 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 

Y entonces se le puede llamar

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

Trabajar en C# 2 también – Softlion

+0

No estoy seguro de si se trata de una característica C# 5, pero en su ejemplo podría declarar 'vacío estático T2 (int a, int b = 1) {}' por ejemplo y aún no tendrá errores hasta 't3'. Parece que las coincidencias de delegado/firma simplemente funcionan sobre la base de la coincidencia de parámetros opcionales, en lugar del valor predeterminado. –

Cuestiones relacionadas