为什么第一类函数的类型不能包含byrefs?

Muh*_*zan 6 f#

例如,以下是不允许的,我不知道为什么:

> let f () = 
    let f2 (a : byref<int>) =
        ()
    let mutable a = 0
    f2 &a;;
Run Code Online (Sandbox Code Playgroud)

我的猜测是,byref可能是对堆栈变量的可变引用,如果f2决定将其存储在某个地方,它可能会超出范围.或者是别的什么?

kvb*_*kvb 10

.NET类型系统不允许将byref类型用作泛型类型参数(例如,您无法创建List<byref<int>>).由于(第一类)F#函数实际上是该FSharpFunc<_,_>类型的实例,这意味着F#函数也不能在其域或范围中使用byref.