小编ban*_*low的帖子

为什么F#generic struct有额外的__dummy字段?

使用F#Interactive,您可以验证以下大小:

// sizeof<A> = 4 bytes
type A (i: int) = struct end

// sizeof<B<int>> = 8 bytes (use any type parameter)
type B<'T> (i: int) = struct end
Run Code Online (Sandbox Code Playgroud)

额外大小的原因似乎是__dummy在通用情况下存在整数字段.再次使用F#Interactive,您可以使用typeof以下内容查看:

  • typeof<A> 节目 DeclaredFields = [|Int32 i|]
  • typeof<B<int>> 节目 DeclaredFields = [|Int32 i; Int32 __dummy|]

我不明白为什么要__dummy添加这个字段.

我认为负责添加它的代码在这里:

https://github.com/fsharp/FSharp.Compiler.Service/blob/master/src/fsharp/ilxgen.fs

第6377行显示:

if requiresExtraField then 
    yield mkILInstanceField("__dummy",cenv.g.ilg.typ_int32,None,ILMemberAccess.Assembly) ]
Run Code Online (Sandbox Code Playgroud)

6290行就是requiresExtraField定义:

let requiresExtraField = 
    let isEmptyStruct = 
        (match ilTypeDefKind with ILTypeDefKind.ValueType -> true | _ -> …
Run Code Online (Sandbox Code Playgroud)

compiler-construction generics f# struct sizeof

19
推荐指数
1
解决办法
333
查看次数

F#编译器需要项目引用,但方法是私有的

F#编译器给出一个错误,说我必须添加一个项目引用,因为我使用的类型有一个存在于该项目中的方法参数.但这种方法是私密的!

我有以下项目结构:

程序 - >库 - >子库

子库包含以下内容:

namespace SubLibrary

type Widget = { Value: int }
Run Code Online (Sandbox Code Playgroud)

包含:

namespace Library

open SubLibrary

type Banana =
    { Value: int }

    member private x.TakeWidget (w: Widget) = ()
Run Code Online (Sandbox Code Playgroud)

程序包含:

open Library

[<EntryPoint>]
let main argv = 
    printfn "%A" argv

    let banana = { Value = 42 }
    0
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

error FS0074:
The type referenced through 'SubLibrary.Widget' is defined in an assembly that is not referenced.
You must add …
Run Code Online (Sandbox Code Playgroud)

methods f# compiler-errors private project

10
推荐指数
1
解决办法
196
查看次数