¿Por qué no se puede convertir una función con byref directamente en delegado?
En circunstancias normales, las funciones de F # se pueden convertir en delegados llamando anew DelegateType
y pasando la función como argumento. Pero cuando el delegado contienebyref
parámetro, esto no es posible directamente. Por ejemplo el código:
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 compilará, dando el siguiente error:
Este valor de función se está utilizando para construir un tipo de delegado cuya firma incluye un argumento byref. Debe usar una expresión lambda explícita que tome 1 argumentos.
Siguiendo el error, modificando el código para usar
let d = new ActionByRef<_>(fun x -> f(&x))
trabajos. Pero mi pregunta es: ¿por qué es esto necesario? ¿Por qué F # no permite la conversión de la función nombrada a este delegado, pero la conversión de lambda está bien?
e encontré con este comportamiento al investigarotra pregunt. Me doy cuenta debyref
es solo para compatibilidad con otros lenguajes .Net.