F# 为什么我会看到这个程序+;printfn尝试打印对象时的前缀?
我有一个我创建的类的对象,我正在用%a格式说明符打印该对象,我看到的是typename程序+myclass,而不仅仅是myclass?为什么呢 有人可能会说程序就是名称空间,如果是这样的话,那么为什么我不能做到以下几点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 =
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