我有一个我创建的类的对象,我用%A格式说明符打印该对象,我看到typename Program + myclass而不仅仅是myclass?那是为什么?
有人可能会说Program是命名空间,如果是,那么为什么我无法执行以下操作?
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
答案 0 :(得分:4)
所有类都隐式放在模块中。
Program
只是当您的程序只是一个文件时隐式创建的模块的名称。
例如,在fsi中运行代码将打印
Here is myclass object FSI_0003+myclass
前缀只是模块的名称。然后编译器会隐藏此实现,以便您不能自己使用它,但如果您使用了反射,则可以使用它。
答案 1 :(得分:3)
正如John正确解释的那样,+
中Program+myclass
之前的部分就在那里,因为您的代码被编译为Program
模块。 F#模块被编译为嵌套类,因此myclass
实际上是Program
(这是一个静态类)中的嵌套类,而+
来自嵌套类的标准.NET命名。
您可以通过将类放在命名空间中来避免这种情况(但您仍需要在模块中使用main
函数):
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
现在,myclass
直接位于命名空间中(而不是嵌套类),因此它将在没有Program+
前缀的情况下打印。