F# 为什么我会看到这个程序+;printfn尝试打印对象时的前缀?

F# 为什么我会看到这个程序+;printfn尝试打印对象时的前缀?,f#,c#-to-f#,F#,C# To F#,我有一个我创建的类的对象,我正在用%a格式说明符打印该对象,我看到的是typename程序+myclass,而不仅仅是myclass?为什么呢 有人可能会说程序就是名称空间,如果是这样的话,那么为什么我不能做到以下几点 let o = Program+myclass() 这是我的全部代码 open System type myclass() = member val X = 3 with get,set [<EntryPoint>] let main argv =

我有一个我创建的类的对象,我正在用%a格式说明符打印该对象,我看到的是typename程序+myclass,而不仅仅是myclass?为什么呢

有人可能会说程序就是名称空间,如果是这样的话,那么为什么我不能做到以下几点

let o = Program+myclass()
这是我的全部代码

open System

type myclass() = 
    member val X = 3 with get,set

[<EntryPoint>]
let main argv = 

    let o = myclass()

    o |> printfn "Here is myclass object %A"

    Console.ReadKey()
    0 // return an integer exit code
开放系统
键入myclass()=
成员val X=3,带有get、set
[]
让主argv=
设o=myclass()
o |>printfn“这是myclass对象%A”
Console.ReadKey()
0//返回整数退出代码

所有类都隐式放在一个模块中

Program
只是当您的程序只是一个文件时隐式创建的模块的名称

例如,在fsi中运行代码将打印

Here is myclass object FSI_0003+myclass

前缀只是模块的名称。然后编译器会隐藏此实现,这样您就不能自己使用它,但如果您使用反射,则可以使用它。

正如John正确解释的那样,
Program+myclass
+
前面的部分在那里,因为您的代码被编译到
程序
模块中。F#模块被编译成嵌套类,因此
myclass
实际上是
程序中的嵌套类(这是一个静态类),
+
来自嵌套类的标准.NET命名

可以通过将类放在名称空间中来避免这种情况(但仍然需要在模块中使用
main
函数):

名称空间MyProgram
开放系统
键入myclass()=
成员val X=3,带有get、set
主模块=
[]
让主argv=
设o=myclass()
o |>printfn“这是myclass对象%A”
Console.ReadKey()
0//返回整数退出代码
现在,
myclass
直接位于名称空间中(不是作为嵌套类),因此它将不带
Program+
前缀打印

“所有类都隐式地放在一个模块中。”呃,不,它们也可以放在名称空间中。
namespace MyProgram
open System

type myclass() = 
    member val X = 3 with get,set

module Main =    
  [<EntryPoint>]
  let main argv = 
    let o = myclass()
    o |> printfn "Here is myclass object %A"
    Console.ReadKey()
    0 // return an integer exit code