new DelegateType
通常の状況では、F#関数は、関数を呼び出して引数として渡すことにより、デリゲートに変換できます。ただし、デリゲートに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言語との互換性のためだけに意図されていることを理解しています。