向成员添加属性很有效,因为语法与在类型中定义成员时的语法完全相同.
[<TypeAttribute>]
let Foo () =
{
new Baz with
[<MethodAttribute>]
member x.Booga () = ()
}
Run Code Online (Sandbox Code Playgroud)
上面无法使用AttributeUsage编译异常"此属性对此语言元素无效".
即使我添加了属性提示,此错误也不会消失:
[<type: TypeAttribute>]
Run Code Online (Sandbox Code Playgroud)
如果将属性移动到对象表达式旁边,那么它似乎有意义,代码甚至不会解析.
let Foo () =
[<TypeAttribute>]
{
new Baz with
member x.Booga () = ()
}
Run Code Online (Sandbox Code Playgroud)
解析错误是绑定中的"意外符号"[<'.
let Foo () =
{
[<TypeAttribute>]
new Baz with
member x.Booga () = ()
}
Run Code Online (Sandbox Code Playgroud)
在此处移动属性无法解析"表达式中的意外符号'[<".预期'}'或其他标记","定义中的"不匹配的'{'"和"意外的关键字'成员'".最坏的结果呢.
所以在这一点上我的选择是放弃使用对象表达式来支持模块中的私有类型.
[<TypeAttribute>]
type private myBaz () =
interface Bax with
member x.Booga () = ()
let Foo () = new myBaz ()
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我更喜欢一种允许使用对象表达式的替代方案.
还有其他选择吗?
f# ×1