Мне кажется, проблема в том, что byref<'T>
не является фактическим типом в F # - он выглядит как тип (чтобы упростить язык), но он компилируется в параметр, помеченный флагом out
.Это означает, что byref<'T>
может использоваться только там, где компилятор может фактически использовать флаг out
.
Проблема со значениями функции заключается в том, что вы можете создать функцию, например, путем частичного применения:
let foo (n:int) (b:byref<int>) =
b <- n
Когда вы передаете foo
в качестве аргумента в конструктор делегата, это частный случай частичного применения (без аргументов), но частичное приложение фактически должно создать новый метод, а затем передать егоделегат:
type IntRefAction = delegate of byref<int> -> unit
let ac = IntRefAction(foo 5)
Компилятор может быть умным и генерировать новый метод с параметром byref
(или флагом out
), а затем передавать его по ссылке на фактическую функцию, но в целом будетдругой метод, сгенерированный компилятором, когда вы не используете синтаксис fun ... -> ...
.Обработка этого добавила бы сложности, и я думаю, что это относительно редкий случай, поэтому компилятор F # не делает этого и просит вас быть более явным ...