2011-01-26 14 views
17

pregunta primera vez para mí :)valor predeterminado en el predicado genérico como argumento

necesito alguna manera de definir un predicado por defecto utilizando un genérico en el formato

Func<T, bool> 

y luego usar esto como un defecto argumento. Algo como esto:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = (T t) => true) 

cuando hago esto me sale el error de compilación:

valor del parámetro por defecto para 'predicado' debe ser una constante en tiempo de compilación

¿Existe una manera suave de hacer esto que me falta o debería hacer que la función de predicado sea nulable y cambiar la lógica de mi función en consecuencia?

Gracias,

Respuesta

21

Los valores predeterminados para los parámetros del método tienen que ser constantes de tiempo de compilación, ya que los valores predeterminados se copian en realidad en todos los sitios de llamada del método por parte del compilador.

usted tiene que utilizar una sobrecarga para hacer esto:

public bool Broadcast(byte command, MemoryStream data, bool async) { 
    return Broadcast(command, data, async, t => true); 
} 

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate) { 
    // ... 
} 

Además, hay un Predicate<T> delegado específico en mscorlib que se puede utilizar en su lugar. Es la misma firma que Func<T, bool>, pero marca explícitamente como un delegado que decide si una acción se realiza en casos de T

+0

yo voy con esto por la información adicional proporcionada por el predicado Bakery

2

hacer una sobrecarga de difusión que no toma el último argumento.

2

Prueba esto:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = default(Func<T, bool>)) 

Pero yo creo que hay que comprobar si el predicado! = nulo.

+1

En este caso puede ser que también acaba de hacer difusión pública bool (orden de bytes, los datos MemoryStream, asíncrono bool, Func predicado = null) – Bakery

Cuestiones relacionadas