通常、F#関数はnew DelegateType
を呼び出し、引数として関数を渡すことによって代理人に変換できます。しかし、代理人にbyref
パラメータが含まれている場合、これは直接行うことはできません。たとえばコード:byrefのある関数を代理人に直接変換できないのはなぜですか?
let d = new ActionByRef<_>(fun x -> f(&x))
作品を使用するようにコードを修正し、エラー後
This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking 1 arguments.
:
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)
は、次のエラーを与えて、コンパイルされません。しかし、私の質問は、なぜこれが必要なのでしょうか?なぜF#は名前付き関数からこの代理人への変換を許可しませんが、lambdaからの変換はうまくいきますか?
another questionを調べてこの現象が発生しました。 byref
は、他の.Net言語との互換性のためだけに使用されています。
興味深いことに、私はそれを考えませんでした。 1つのニックピック、私は 'byref'は' ref'と似ていて、 'out'ではないと思う。 – svick
@svick - あなたは正しい - 実際、ILレベルでは、フラグは 'ref'であり、C#' out'は全く存在しません... –
右、C#の 'out'は実際に' ref'と'System.Runtime.InteropServices.Out'属性です。 – ildjarn