Почему функция с byref не может быть преобразована напрямую в делегат?

В обычных условиях функции F # могут быть преобразованы в делегаты путем вызоваnew DelegateType и передача функции в качестве аргумента. Но когда делегат содержитbyref Параметр, это невозможно напрямую. Например код:

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)

не скомпилируется, выдав следующую ошибку:

Это значение функции используется для создания типа делегата, чья подпись включает аргумент byref. Вы должны использовать явное лямбда-выражение, принимающее 1 аргумент.

После ошибки измените код для использования

let d = new ActionByRef<_>(fun x -> f(&x))

работает. Но мой вопрос: зачем это нужно? Почему F # не разрешает преобразование из именованной функции в этот делегат, но преобразование из лямбды в порядке?

Я столкнулся с этим поведением при исследованииДругой вопрос, я понимаюbyref предназначен только для совместимости с другими языками .Net.

Ответы на вопрос(1)

Ваш ответ на вопрос