En circunstancias normales, las funciones F # se pueden convertir a delegados llamando al new DelegateType
y pasando la función como un argumento. Pero cuando el delegado contiene el parámetro byref
, esto no es posible directamente. Por ejemplo el código:¿Por qué una función con byref no se puede convertir directamente en delegar?
type ActionByRef<'a> = delegate of 'a byref -> unit
let f (x:double byref) =
x <- 6.0
let x = ref 42.0
let d = new ActionByRef<_>(f)
no se compilará, dando el siguiente error:
This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking 1 arguments.
Tras el error, modificar el código para utilizar
let d = new ActionByRef<_>(fun x -> f(&x))
obras. Pero mi pregunta es: ¿por qué es esto necesario? ¿Por qué F # no permitirá la conversión de la función nombrada a este delegado, pero la conversión de lambda está bien?
Me encontré con este comportamiento al investigar another question. Me doy cuenta de que byref
es solo para compatibilidad con otros lenguajes .Net.
Interesante, no pensé en eso. Un pequeño detalle, creo que 'byref' es más como' ref', no 'out'. – svick
@svick - Estás en lo cierto - en realidad, en el nivel IL, la bandera es 'ref' y la C#' out' no existe en absoluto ... –
Derecha, C# 's' out' es en realidad 'ref' más Atributo 'System.Runtime.InteropServices.Out'. – ildjarn