2010-03-15 9 views

risposta

28

realtà Func è solo un semplice delegato dichiarato in .NET Struttura. In realtà ci sono diversi delegati Func dichiarato lì:

delegate TResult Func<TResult>() 
delegate TResult Func<T, TResult>(T obj) 
delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2) 
delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3) 
delegate TResult Func<T1, T2, T3, T4, TResult>(T1 obj1, T2 obj2, T3 obj3, T4 obj4) 

Quindi l'unica cosa che puoi fare è dichiarare il delegato personalizzato:

delegate bool MyFunc<T1, T2>(T1 a, out T2 b) 
6

Hai bisogno di fare il proprio tipo delegato, in questo modo:

delegate bool MyFunc(Type1 a, out Type2 b); 
+0

questo è l'unico modo? – Benny

+0

Sì. I delegati generici 'Func' sono tipi generici regolari che utilizzano parametri di tipo regolari. 'out b' non è un tipo. – SLaks

5

Si potrebbe desiderare di ripensare il vostro disegno. Hai veramente bisogno di complicare il tuo codice aggiungendo un parametro out?

Puoi avvolgere il tipo di ritorno bool e il secondo out tipo nella propria classe (o NET 4.0 Tuple) e utilizzarlo come un tipo di ritorno:

public Func<Type1, Tuple<Type2, bool>> DetectMethod; 

Naturalmente quando si desidera utilizzare il delegati a fare riferimento ai metodi try-parse, sei sulla strada giusta e dovrai definire un nuovo delegato come altri già descritti.

+0

Questo è anche più compatibile con LINQ rispetto ai delegati personalizzati con parametri di rif o out. – Libor