当printfn尝试打印对象时,为什么会看到Program +前缀?

时间:2014-06-23 05:22:20

标签: f# c#-to-f#

我有一个我创建的类的对象,我用%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

2 个答案:

答案 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+前缀的情况下打印。