2011-01-26 5 views
17

Prima domanda volta per me :)Il valore di default sul predicato generico come argomento

ho bisogno di qualche modo per definire un predicato predefinito utilizzando un generico sul formato

Func<T, bool> 

e quindi utilizzare questo come un difetto discussione. Qualcosa di simile a questo:

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

Quando faccio questo io ottenere l'errore di compilazione:

valore di parametro predefinito per 'predicato' deve essere una costante della fase di compilazione

c'è un modo agevole di fare questo che mi manca o che dovrebbe rendere nullabile il predicato e modificare di conseguenza la logica della mia funzione?

Grazie,

risposta

21

I valori predefiniti per i parametri del metodo devono essere costanti in fase di compilazione, poiché i valori predefiniti vengono effettivamente copiati in tutti i siti di chiamata del metodo dal compilatore.

è necessario utilizzare un sovraccarico per fare questo:

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

Inoltre, v'è una specifica Predicate<T> delegato in mscorlib che è possibile utilizzare invece. E 'la stessa firma Func<T, bool>, ma segna in modo esplicito come un delegato che decide se viene eseguita un'azione su istanze di T

+0

Vado con questo per le informazioni aggiuntive fornite sul Predicato Bakery

2

fare un sovraccarico per Broadcast che non tiene l'ultimo argomento.

2

Prova questo:

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

Ma io penso che si debba verificare la presenza di predicato! = null.

+1

In questo caso potrei anche fare solo bool pubblico Broadcast (comando byte, dati MemoryStream, bool asincrono, Func predicate = null) – Bakery