我正在尝试为一个具有byref返回方法的类型添加F#风格的接口。 以下是代码:
type IPool<'P, 'T when 'T: struct> =
abstract member GetReference: ITypedPointer<'P, 'T> -> byref<'T>
let Ref<'TPool, 'P, 'T when 'TPool :> IPool<'P, 'T>> (pool: 'TPool) pointer =
pool.GetReference pointer
令我惊讶的是,在我引入IPool
接口之前,类似的事情都能正常工作。在那之前,Ref
本身包含了一个实现,例如&pool.data.[idx]
,并且可以正常工作。
我尝试安装F# Tools的夜间构建版本,因为最新版本不支持byref返回,而且刚刚完成了引入它们的PR:https://github.com/Microsoft/visualfsharp/pull/4888
但是,在Visual Studio中仍然会收到错误消息错误 FS3209:此时无法使用变量'copyOfStruct'的地址。方法或函数可能无法返回此局部值的地址。
。类型outref<T>
也似乎仍然不可用。我有什么遗漏吗?
我还尝试省略pointer
参数,只返回pool.GetReference
,结果得到另一条错误消息。
附加说明:最终目标是能够执行以下操作:
let aref = Ref pool ptr
let bref = Ref pool ptr
aref <- 42
assert(aref = bref)
例如,为调用者提供一个内部存储器的直接引用,通常由数组支持,类似于Span<T>
。出于性能原因,我正在制作这个功能,因此每次调用Ref
时分配内存是不可行的。
let x = Ref pool ptr; x <- 10
- LOSTref
引用单元呢? - Aaron M. Eshbachlet x = [| 1 |]; let r1 = ref x.[0]; let r2 = ref x.[0]; r1 := 2; !r2
将产生1
。如果我改用&x.[0]
,结果将是2
。 - LOST