在F#中,当在命名空间中的模块中时,记录类型可以公开吗?

问题描述

在F#中,直接放置在命名空间中的记录类型将被编译为C#的类类型。

e.g.,namespace MyNameSpace
type MyType  = { Name: string; Content: string; Text: string }

MyType将被C#视为静态公共类。

但是C#在命名空间中的模块中如何查看MyType?

e.g.,namespace MyNameSpace
 module MyModule
    type MyType  = { Name: string; Content: string; Text: string }

如果它是MyModule的私有文件,是否可以将其公开用于C#?

(我在Google上找不到此答案:()

TIA

解决方法

默认情况下,我相信所有模块成员都将遵循相同的公共静态声明形式。在此处编译示例会导致从C#中轻松访问MyType类:

static void Main(string[] args)
{
    var foo = new MyNameSpace.MyModule.MyType("x","b","c");
}

为了强制对模块成员的访问控制,您需要稍微调整声明:

module MySecrets =
    type private SecretType = { Password: string }

编辑:啊哈,找到相关页面:https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/access-control

,

F#模块被编译为一个类。如果模块内有类型声明,它将被编译为嵌套类。在您的MyNameSpace.MyModule.MyType的示例中,MyNameSpace部分是名称空间,而MyModule(还有MyType)是类。

在C#中,您可以使用.访问嵌套类,但是在CLR级别上,可以使用+访问嵌套类,因此,如果要访问MyType,例如使用{ {1}},您需要使用:

Type.GetType

请注意,这在F#Interactive中不起作用,F#Interactive向名称空间添加了另一个名称,但在编译后的代码中有效。我不确定WPF中的System.Type.GetType("MyNameSpace.MyModule+MyType") 的工作方式,但是您可能需要使用名称为DataTemplate的CLR格式来指定类型。