2009-09-30 6 views
31

Tengo un método con un parámetro out, y me gustaría señalar un Action o Func (u otro tipo de delegado) en él.¿Puedo tener una Acción <> o Func <> con un parámetro out?

Esto funciona bien:

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

Sin embargo esto no

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

hace esto es probablemente un duplicado, pero la búsqueda de 'parámetro out' no es particularmente fructífera.

+0

posible duplicado de [Func con el parámetro OUT] (http://stackoverflow.com/questions/1283127/funct-with -out-parameter) – nawfal

Respuesta

47

Acción y Func específicamente no sacar o ref parámetros. Sin embargo, son solo delegados.

Puede hacer un tipo de delegado personalizado que tome un parámetro out, y lo use.

Por ejemplo, las siguientes obras:

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(); 
    } 
} 

Esto muestra:

3/5 
0/0 
+0

En el ejemplo anterior, el tipo 'OutAction ' está anidado dentro del tipo 'Program'. Esto está perfectamente bien. Pero también es posible tener un tipo de delegado no anidado, es decir, 'OutAction ' podría ser un miembro directo del 'namespace'. –

2

No, no con los delegados incorporadas. out y ref son calificadores especiales y el delegado tiene que configurarse con ellos explícitamente ya que son estilos de llamadas completamente diferentes.

Sin embargo, si ha definido su propio delegado, usted puede hacer esto:

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