F# 从内部类型访问外部类型的成员

F# 从内部类型访问外部类型的成员,f#,xunit,F#,Xunit,我想知道我必须做些什么才能编译以下F代码: type MyType() = [<Literal>] let outer = "Foo" type MyInnerType() = [<Literal>] let inner = outer + ".Bar" 编译器在未定义值或构造函数“outer”时引发错误FS0039。这是不可能的还是设计不允许的 我想在xUnit测试方法的属性中使用这些值,该方法要求这些值是编译时常量,因此[]: 我假设o

我想知道我必须做些什么才能编译以下F代码:

type MyType() =
  [<Literal>]
  let outer = "Foo"

  type MyInnerType() =
    [<Literal>]
    let inner = outer + ".Bar"
编译器在未定义值或构造函数“outer”时引发错误FS0039。这是不可能的还是设计不允许的

我想在xUnit测试方法的属性中使用这些值,该方法要求这些值是编译时常量,因此[]:


我假设outer是一个类字段,所以在引用其内部之前需要实例化该类

这可能适合您:

type MyType() =
  static member outer = "Foo"

  type MyInnerType() =
    let inner = MyType.outer + "Bar"

我假设outer是一个类字段,所以在引用其内部之前需要实例化该类

这可能适合您:

type MyType() =
  static member outer = "Foo"

  type MyInnerType() =
    let inner = MyType.outer + "Bar"

可能对您有效的是跨F的文字表达式。下面的代码片段

module A =
    [<Literal>]
    let A = "A"

    module B =
        [<Literal>]
        let B = A + "B"

[<Literal>]
let C = A.A + A.B.B + "C"

这意味着F编译器很乐意将来自不同模块的文本和常量表达式(可能是嵌套的)组合到常量表达式中。

可能适合您的是跨F的文本表达式。下面的代码片段

module A =
    [<Literal>]
    let A = "A"

    module B =
        [<Literal>]
        let B = A + "B"

[<Literal>]
let C = A.A + A.B.B + "C"

这意味着F编译器乐于从不同的模块(可能是嵌套的)组合文本和常量表达式,进入一个常量表达式。

我希望outer是用C写的常量字符串outer,因此是一个静态成员。我希望outer是用C写的常量字符串outer,因此是一个静态成员。从MyInnerType看不到outer的原因是编译器实际上将outer视为MyType的构造函数,因此,在生成的IL中,外部绑定甚至不存在。因为MyType中没有对绑定的引用,所以它被完全优化了。如果MyType中有一个引用了outer的属性或方法,那么outer的值将直接复制到该属性或方法中,但实际的绑定仍将被删除。另一件需要注意的事情是,简单地将MyInnerType类标识为MyType的成员并不能使其成为F中的内部类。F不支持嵌套类。@AaronM.Eshbach有没有办法使外部公开而不是私有?能否将文本放在模块中而不是类?因为我知道F不支持嵌套类,所以我可以用模块实现它。从MyInnerType看不到outer的原因是编译器实际上将outer视为MyType构造函数中的局部变量,因此,在生成的IL中,外部绑定甚至不存在。因为MyType中没有对绑定的引用,所以它被完全优化了。如果MyType中有一个引用了outer的属性或方法,那么outer的值将直接复制到该属性或方法中,但实际的绑定仍将被删除。另一件需要注意的事情是,简单地将MyInnerType类标识为MyType的成员并不能使其成为F中的内部类。F不支持嵌套类。@AaronM.Eshbach有没有办法使外部公开而不是私有?能否将文本放在模块中而不是类?因为我知道F不支持嵌套类,所以我可以用模块来实现它。模块可以嵌套吗?这样我就可以省略A。而只在嵌套到模块A中的模块Z中写入A?@David是的,它们可以这样嵌套。我已经修改了我的代码片段来演示这样的组合。模块是否可以嵌套,这样我就可以省略A。而只在嵌套到模块A中的模块Z中写入A?@David是的,它们可以这样嵌套。我已经修改了我的代码片段来演示这种组合。