为什么F#不允许C#的多个属性?

时间:2012-09-27 12:23:07

标签: f# attributes attributeusage allowmultiple

以下代码在C#中编译:

[ContentType("text")]
[ContentType("projection")]
public class Class1
{
}

F#中的以下代码无法编译:

[<ContentType("text")>]
[<ContentType("projection")>]
type Class1() = class end

F#中的编译错误是:“属性类型'ContentTypeAttribute'具有'AllowMultiple = false'。此属性的多个实例无法附加到单个语言元素。”

通过反编译ContentType,我可以看到ContentType继承自MultipleUsase中的'AllowMultiple = true'的MultipleBaseMetadataAttribute。

事实上,似乎F#没有从父类继承AttributeUsage。

[<AttributeUsage(AttributeTargets.Class, AllowMultiple = true)>]
type FooAttribute() = 
    inherit Attribute()

type BarAttribute() =
    inherit FooAttribute()

[<Foo>]
[<Foo>]
type MyClassCompiles() = class end

,其中

[<Bar>]
[<Bar>]
type MyClassDoesNotCompile() = class end

1 个答案:

答案 0 :(得分:8)

看起来像个错误。电子邮件fsbugs [at] microsoft.com。这是另一个明显的错误:它似乎不尊重AttributeTargets

[<AttributeUsage(AttributeTargets.Enum)>]
type FooAttribute() = 
  inherit Attribute()

[<Foo>]
type T = struct end //happily compiles