【问题标题】:F#: Is there a way to add attributes to the Type output by an ObjectExpressionF#:有没有办法通过 ObjectExpression 向 Type 输出添加属性
【发布时间】:2010-02-11 07:25:34
【问题描述】:

向成员添加属性效果很好,因为语法与在类型中定义成员时完全相同。

[<TypeAttribute>]
let Foo () =
  {
    new Baz with
      [<MethodAttribute>]
      member x.Booga () = ()
  }

以上无法编译,出现 AttributeUsage 异常“此属性不适用于此语言元素”。

即使我添加属性提示,此错误也不会消失:

[<type: TypeAttribute>]

如果将属性移到对象表达式旁边,似乎有意义的地方,代码甚至不会解析。

let Foo () =
  [<TypeAttribute>]
  {
    new Baz with
      member x.Booga () = ()
  }

解析错误是“Unexpected symbol '[

let Foo () =
  {
    [<TypeAttribute>]
    new Baz with
      member x.Booga () = ()
  }

在此处移动属性无法解析“表达式中出现意外符号'[

所以此时我的选择是放弃使用对象表达式,转而使用模块中的私有类型。

[<TypeAttribute>]
type private myBaz () =
 interface Bax with
   member x.Booga () = ()

let Foo () = new myBaz ()

这很好,但我更喜欢允许使用对象表达式的替代方法。

还有其他选择吗?

【问题讨论】:

    标签: f#


    【解决方案1】:

    属性不能用于对象表达式,尽管这似乎是对语言未来扩展的合理建议(我将记录一个建议)。

    http://msdn.microsoft.com/en-us/library/dd233179(VS.100).aspx

    【讨论】: