– 2 respuestas" /> – 2 respuestas" />

Parámetro "Out" (referencia) con Acción

Tengo muchos métodos similares a este:

 void GetColorSky(out float r, out float g, out float b)
 void GetColorGround(out float r, out float g, out float b)

"Similar", lo que significa que tienen exactamente el mismo encabezado de método, excluyendo el nombre del método. También tengo varios controles "colorPicker", que aceptan valores R, G, B.

Estoy tratando de crear un método que acepte un método como uno de sus parámetros, así:

UpdateColourPicker(ColorPicker cp, CustomMethod cMethod)

y llámelo de la siguiente manera:

UpdateColourPicker(cpSky, GetColorSky)
UpdateColourPicker(cpGround, GetColorGround)

¿Cuál es la sintaxis correcta para out and Action ¿juntos? he mirado esta pregunta pero aun no lo he logrado.

¡Gracias!

preguntado el 12 de junio de 12 a las 13:06

Como pauta general, sería mejor que sus funciones devuelvan valor en lugar de usar parámetros, ya que hacen que las funciones no sean componibles:

¿Qué hay de malo en declarar esos métodos como Color GetColorSky()? Todos esos parámetros de salida me parecen bastante innecesarios. -

@Ankur No tengo elección. Las funciones no provienen de C# sino de una DLL externa, por lo que debo usar referencias. Gracias por el consejo. -

posible duplicado de Func sin parámetro -

2 Respuestas

Siguiendo el ejemplo de esa respuesta vinculada, esto funcionará:

public delegate void GetColorDel(out float r, out float g, out float b);

void UpdateColourPicker(ColorPicker cp, GetColorDel cMethod) { }

UpdateColourPicker(cpSky, GetColorSky);
UpdateColourPicker(cpGround, GetColorGround);

Desafortunadamente, como se indica en la respuesta a la pregunta que vincula, Action and Func no trabaje con out and ref. Esto es simplemente porque Action and Func son solo definiciones de delegado establecidas (bastantes veces para ofrecer diferentes sobrecargas) con genéricos en el BCL. agregando ref and out las variantes provocarían rápidamente errores del compilador de redefinición.

La muestra completa:

class Program
{        
    public delegate void GetColorDel(out float r, out float g, out float b);

    static void Main(string[] args)
    {
        UpdateColourPicker(null, GetColorSky);
        UpdateColourPicker(null, GetColorGround);

        Console.Read();
    }

    static void GetColorSky(out float r, out float g, out float b) 
    {
        r = g = b = 0f;
        Console.WriteLine("sky"); 
    }

    static void GetColorGround(out float r, out float g, out float b) 
    {
        r = g = b = 0f;
        Console.WriteLine("ground"); 
    }

    static void UpdateColourPicker(object cp, GetColorDel cMethod) 
    {
        float r, g, b;
        cMethod(out r, out g, out b);
    }
}

Respondido el 12 de junio de 12 a las 13:06

Quiere saber cómo usar uno de los Action delegados. - leppie

@leppie: Ya le dijiste al OP que out no es compatible con tipos genéricos, por lo que claramente sabe que no puede usar out con Action<> delegados No estoy seguro de a qué se refiere tu comentario. - Gabe

@leppie Lo sé, y eso se responde en su propia pregunta vinculada. Voy a modificar para ser más claro. - adam houldsworth

Gracias por una respuesta completa. No pude obtener la sintaxis correcta. - David

@David Esto cubre el float variante del método, si desea utilizar genéricos entonces Respuesta de @jeroenh es la sintaxis que necesita. Desafortunadamente, los métodos genéricos y de estilo aritmético no suelen encajar muy bien, ya que los operadores estándar no son compatibles a través de restricciones genéricas (+, -, *, etc.), por lo que vería poco beneficio en preocuparme por los genéricos por ahora. - adam houldsworth

Si desea definir un delegado genérico sin parámetros, debe hacerse así:

delegate void ActionWithOutparameter<T>(out T x);
delegate void ActionWithOutparameter<T1, T2>(out T1 x, out T2 y);
// ...

Claramente el Action and Func los delegados en el BCL no coinciden con esta firma.

Respondido el 12 de junio de 12 a las 13:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.