使用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) 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)