2009-11-10 8 views

Respuesta

35

No, no se puede utilizar el paso por referencia a los Action delegados. Si bien no existe un concepto de "tipo pasado por referencia" como Type en el marco, no es realmente un tipo en el sentido normal en lo que se refiere a C#. ref es un modificador para el parámetro, no parte del nombre del tipo, si ves lo que quiero decir.

Sin embargo, usted puede construir su propio conjunto de tipos equivalentes, por ejemplo,

delegate void ActionRef<T>(ref T item); 

Por supuesto, si quieres una mezcla de parámetros ref y no al árbitro en el mismo delegado, se obtiene en un conjunto horrible combinaciones:

delegate void ActionRef1<T1, T2>(ref T1 arg1, T2 arg2); 
delegate void ActionRef2<T1, T2>(T1 arg1, ref T2 arg2); 
delegate void ActionRef3<T1, T2>(ref T1 arg1, ref T2 arg2); 
+0

es esta la única para definir con la sintaxis lambda? ActionRef Setter2 = (ref int x, int y) => x = y; Está bien ... pero solo un poco más de lo normal. – sgtz

+1

@sgtz: Sospecho que sí, es un requisito bastante inusual, así que no me sorprende si no ha habido mucho trabajo para hacerlo conciso. –

+0

¿qué tal "ref R [i]" donde R es una lista . es posible? ¿Te gustaría que planteara esto como una nueva pregunta? – sgtz

5

Usted puede, siempre y su referencia es un objeto complejo (tiene propiedades).

Ejemplo objeto:

public class MyComplexObject 
{ 
    /// <summary> 
    /// Name provided for the result. 
    /// </summary> 
    public string Name { get; set; } 

    /// <summary> 
    /// Value of the result. 
    /// </summary> 
    public object Value { get; set; } 
} 

utilizar en una Acción:

Action<MyComplexObject> myAction = (MyComplexObject result) => 
{ 
    result.Value = MyMethodThatReturnsSomething();            
}; 

Debido a que no se cambia la referencia MyComplexObject, se conserva los datos.

también posted on my blog.

Cuestiones relacionadas