Por que uma função com byref não pode ser convertida diretamente para delegar?
Em circunstâncias normais, as funções F # podem ser convertidas em delegados chamandonew DelegateType
e passando a função como argumento. Mas quando o delegado contémbyref
parâmetro, isso não é possível diretamente. Por exemplo, o 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)
não será compilado, fornecendo o seguinte erro:
Este valor da função está sendo usado para construir um tipo de delegado cuja assinatura inclui um argumento byref. Você deve usar uma expressão lambda explícita com 1 argumento
Seguindo o erro, modificando o código para usar
let d = new ActionByRef<_>(fun x -> f(&x))
trabalho. Mas minha pergunta é: por que isso é necessário? Por que o F # não permite a conversão da função nomeada para esse delegado, mas a conversão do lambda é bo
Eu me deparei com esse comportamento ao pesquisaroutra pergunt. Eu percebibyref
destina-se apenas à compatibilidade com outros idiomas .Net.