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

时间:2018-01-17 15:30:44

标签: f# xunit

我想知道为了使下面的F#代码编译我必须做什么:

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

  type MyInnerType() =
    [<Literal>]
    let inner = outer + ".Bar"

编译器引发错误FS0039“未定义值或构造函数'outer'”。这是不可能或设计不允许的事情吗?

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

    [<Trait("", inner)>]
    [<Fact>]
    let test() =
      Assert.Equal(3, 1 + 2)

2 个答案:

答案 0 :(得分:4)

可能对你有用的是在F#modules中使用的文字表达。以下代码段

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

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

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

fsi消费为

module A = begin
  val A : string = "A"
  module B = begin
    val B : string = "AB"
  end
end
val C : string = "AABC"

意味着F#编译器很乐意将来自不同模块的文字和常量表达式组合成一个常量表达式。

答案 1 :(得分:3)

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

这可能对您有用:

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

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