In circostanze normali, le funzioni F # possono essere convertite in delegati chiamando lo new DelegateType
e passando la funzione come argomento. Ma quando il delegato contiene il parametro byref
, questo non è possibile direttamente. Per esempio il codice:Perché una funzione con byref non può essere convertita direttamente in delegato?
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)
non verrà compilato, dando il seguente errore:
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.
Dopo l'errore, modificare il codice per utilizzare
let d = new ActionByRef<_>(fun x -> f(&x))
opere. Ma la mia domanda è: perché è necessario? Perché F # non consente la conversione dalla funzione denominata a questo delegato, ma la conversione da lambda va bene?
Mi sono imbattuto in questo comportamento durante la ricerca di another question. Mi rendo conto che lo byref
è inteso solo per compatibilità con altri linguaggi .Net.
Interessante, non ci ho pensato. Un nitpick, penso che 'byref' sia più come' ref', non 'out'. – svick
@svick - Sei corretto - in realtà, a livello IL, il flag è 'ref' e C#' out' non esiste affatto ... –
A destra, 'out' di C# è in realtà' ref' più il Attributo 'System.Runtime.InteropServices.Out'. – ildjarn