【发布时间】:2018-06-26 13:01:32
【问题描述】:
我想知道我必须做什么才能编译以下 F# 代码:
type MyType() =
[<Literal>]
let outer = "Foo"
type MyInnerType() =
[<Literal>]
let inner = outer + ".Bar"
编译器引发错误 FS0039“未定义值或构造函数‘外部’”。这是不可能的还是设计不允许的?
我想在 xUnit 测试方法的属性中使用这些值,该方法要求这些值是编译时常量(因此 [<Literal>]):
[<Trait("", inner)>]
[<Fact>]
let test() =
Assert.Equal(3, 1 + 2)
【问题讨论】:
-
从
MyInnerType看不到outer的原因是编译器实际上将outer视为MyType的构造函数中的局部变量,因此,在IL 中生成时,outer绑定甚至不存在。由于MyType中没有对绑定的引用,因此它被完全优化掉了。如果你在MyType中有一个引用outer的属性或方法,那么outer 的值将被直接复制到该属性或方法中,但实际的绑定仍然会被删除。 -
另外需要注意的是,仅仅将
MyInnerType类标识为MyType的成员并不能使其成为F# 中的内部类。 F# 不支持嵌套类。 -
@AaronM.Eshbach 有没有办法让
outerpublic而不是private? -
你能把你的文字放在一个模块中而不是放在类中吗?
-
自从我了解到 F# 不支持嵌套类,我可以用模块来实现它。