以下代码未按预期格式化字符串(它只打印完全限定的类名):
module internal MyModule.Types
type Action =
| Add of int
| Update of int * string
| Delete of string
module internal MyModule.Print
open MyModule.Types
let printStuff (x:Action) =
printfn "%A" x
但是,如果未将MyModule.Types
指定为internal
,则格式设置将按预期工作。为什么格式化不适用于internal
模块?它与反射有关吗?除了将模块公开之外,还有解决方法吗?
我应该提到模块是在单独的.fs文件中。
答案 0 :(得分:1)
这对我有用,例如我得到输出:
λ。\ SO180207.exe
加10 添加5
添加5
[||]
您可以看到Add 10
已打印出来。此外,当我访问内部模块时,值和printfn "%A"
语句都被执行了。
这是项目的结构:
MyModule.fs文件:
module internal MyModule.Types
type Action =
| Add of int
| Update of int * string
| Delete of string
let x = Add 5
printfn "%A" x
Program.fs文件:
module MyModule.Program
open MyModule.Types
[<EntryPoint>]
let main argv =
let x = Add 10
printfn "%A" x // prints Add 10
printfn "%A" MyModule.Types.x // prints Add 5 twice
printfn "%A" argv
0 // return an integer exit code
所以也许你可以提供更多关于F#版本的信息,以及你正在运行的环境。也可以在你的类型中override x.ToString()
。
补充评论:
说实话,内部模块可能存在某些内容,就像我覆盖ToString()
一样,内部模块显然不喜欢它,并以StackOverFlowException
终止。例如。这没有internal
修饰符:
module MyModule.Types
type Action =
| Add of int
| Update of int * string
| Delete of string
override x.ToString() = sprintf "%A" (x,x)
let x = Add 5
printfn "%A" x
printfn "%A" (x.ToString()) |> ignore
λ。\ SO180207.exe
加10 添加5
“(加5,加5)”
添加5
[||]