向成员添加属性效果很好,因为语法与在类型中定义成员时的语法完全相同。
[<TypeAttribute>]
let Foo () =
{
new Baz with
[<MethodAttribute>]
member x.Booga () = ()
}
上面无法使用AttributeUsage编译异常“此属性对此语言元素无效”。
即使我添加了属性提示,此错误也不会消失:
[<type: TypeAttribute>]
如果将属性移动到对象表达式旁边,那么它似乎有意义,代码甚至不会解析。
let Foo () =
[<TypeAttribute>]
{
new Baz with
member x.Booga () = ()
}
解析错误是“意外符号”[&lt;'在约束力。
let Foo () =
{
[<TypeAttribute>]
new Baz with
member x.Booga () = ()
}
此处移动属性无法解析“意外符号”[&lt;'在表达式中。预期'}'或其他标记“,”无法匹配'{'“和”意外关键字'成员'在定义中......“。最坏的结果呢。
所以在这一点上我的选择是放弃使用对象表达式来支持模块中的私有类型。
[<TypeAttribute>]
type private myBaz () =
interface Bax with
member x.Booga () = ()
let Foo () = new myBaz ()
这很好,但我更喜欢一种允许使用对象表达式的替代方法。
有替代方案吗?
答案 0 :(得分:6)
属性不能用于对象表达式,虽然它似乎是对未来语言扩展的合理建议(我将记录一个建议)。
http://msdn.microsoft.com/en-us/library/dd233179(VS.100).aspx