2009-09-30 10 views
31

Ho un metodo con un parametro out e desidero indicare uno Action o Func (o un altro tipo di delegato).Posso avere un'azione <> o Func <> con un parametro out?

Questo funziona bene:

static void Func(int a, int b) { } 
Action<int,int> action = Func; 

Tuttavia questo non

static void OutFunc(out int a, out int b) { a = b = 0; } 
Action<out int, out int> action = OutFunc; // loads of compile errors 

Questo è probabilmente un duplicato, ma alla ricerca di 'parametro out' non è particolarmente fruttuoso.

+0

possibile duplicato del [Funz con il parametro out] (http://stackoverflow.com/questions/1283127/funct-with -out-parameter) – nawfal

risposta

47

Azione e Func in modo specifico non estrarre o modificare i parametri. Tuttavia, sono solo delegati.

È possibile creare un tipo di delegato personalizzato che accetta un parametro out e lo utilizza, tuttavia.

Ad esempio, le seguenti opere:

class Program 
{ 
    static void OutFunc(out int a, out int b) { a = b = 0; } 

    public delegate void OutAction<T1,T2>(out T1 a, out T2 b); 

    static void Main(string[] args) 
    { 
     OutAction<int, int> action = OutFunc; 
     int a = 3, b = 5; 
     Console.WriteLine("{0}/{1}",a,b); 
     action(out a, out b); 
     Console.WriteLine("{0}/{1}", a, b); 
     Console.ReadKey(); 
    } 
} 

Questo stampa:

3/5 
0/0 
+0

Nell'esempio precedente il tipo 'OutAction ' è nidificato all'interno del tipo 'Programma'. Questo è perfettamente a posto. Ma è anche possibile avere un tipo di delegato non annidato, ad esempio "OutAction " potrebbe essere un membro diretto del 'namespace'. –

2

No, non con i delegati builtin. out e ref sono qualificatori speciali e il delegato deve essere configurato con loro in modo esplicito poiché sono stili di chiamata completamente diversi.

Tuttavia, se si è definito il proprio delegato, si può fare questo:

delegate void OutAction<T1, T2>(out T1 a, out T2 b); 
Problemi correlati