Почему функция с 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.