2010-03-17 8 views

Respuesta

70

No se puede hacer por Func pero se puede definir una costumbre delegate para ello: ejemplo

public delegate object MethodNameDelegate(ref float y); 

Uso:

public object MethodWithRefFloat(ref float y) 
{ 
    return null; 
} 

public void MethodCallThroughDelegate() 
{ 
    MethodNameDelegate myDelegate = MethodWithRefFloat; 

    float y = 0; 
    myDelegate(ref y); 
} 
+23

La razón es: todos los argumentos de tipo genérico deben ser elementos que son conv ertible para objetar "ref flotar" no es convertible a objeto, por lo que no puede usarlo como un argumento de tipo genérico. –

+1

Gracias por eso, estaba luchando por usar Func, así que sé por qué no puedo usarlo cuando el tipo no es convertible al objeto – chugh97

+0

. ¿Eso significa que la escritura del delegado requerirá boxeo/unboxing en este caso? –

5

En .NET 4+ también se puede apoyar de esta manera ref tipos ...

public delegate bool MyFuncExtension<in string, MyRefType, out Boolean>(string input, ref MyRefType refType); 
+1

No para resucitar un hilo muerto, pero definitivamente debe tenerse en cuenta para cualquiera que se encuentre con esto que, si bien puede admitir un parámetro de referencia con genéricos de esta manera, el parámetro de tipo genérico será invariable. Los parámetros de tipo genérico no admiten la varianza (covarianza o contravarianza) para los parámetros ref o out en C#. Sin embargo, está bien si no necesita preocuparse por conversiones de tipo implícitas. –

+2

Disculpa, esta respuesta está un poco fuera de lugar. El 'in' y el 'out' que muestra para desmarcar al delegado se relacionan con el co-versus "contra-varianza", y no están relacionados con lo que el OP está preguntando. La pregunta era sobre los delegados que pueden aceptar parámetros por referencia, no la agilidad de un delegado (genérico) con respecto a su parametrización de tipo. –

Cuestiones relacionadas