2012-09-27 9 views
8

Poniższy kod kompiluje w C#:Dlaczego funkcja F # nie zezwala na wiele atrybutów, w których działa C#?

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

Poniższy kod w F # nie kompiluje:

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

Błąd kompilacji w F # to: „Typ atrybutu 'ContentTypeAttribute' ma„AllowMultiple = false '. Wiele instancji tego atrybutu nie może być dołączonych do pojedynczego elementu języka. "

Przez dekompilacji contenttype, widzę, że ContentType dziedziczy MultipleBaseMetadataAttribute który ma 'AllowMultiple = true' w AttributeUsage.

W rzeczywistości wygląda na to, że F # nie dziedziczy AttributeUsage z klasy nadrzędnej.

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

type BarAttribute() = 
    inherit FooAttribute() 

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

gdzie

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

Nawiasem mówiąc, to brzmi jak dokładną kopią następującym pytaniem, ale nie jest to w rzeczywistości. Chodzi o F # honorowanie ustawienia AllowMultiple dla atrybutu, a inne pytanie dotyczy składni do łączenia wielu atrybutów w pojedynczej instrukcji. http://stackoverflow.com/questions/9620712/is-it-possible-to-combine-multiple-attributes-in-f –

Odpowiedz

8

Wygląda jak robaka. Wyślij wiadomość e-mail na adres fsbugs [at] microsoft.com. Oto kolejny oczywisty błąd: nie wydaje się, aby uczcić AttributeTargets:

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

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

Dzięki, zarejestrowałem błąd w zespole FSharp. – Johan

Powiązane problemy