2013-08-22 13 views
5

EDYCJA: Dodano bardziej kompletny przykład, który wyjaśnił problem.Atrybuty F #, typeof i "To nie jest wyrażenie stałe"

Niektóre atrybuty .NET wymagają parametru typu Type. Jak deklarować te parametry w F #?

Na przykład w C# możemy to zrobić:

[XmlInclude(typeof(Car))] 
[XmlInclude(typeof(Truck))] 
class Vehicle { } 
class Car : Vehicle { } 
class Truck : Vehicle { } 

Ale w F # Po ...

[<XmlInclude(typeof<Car>)>] 
[<XmlInclude(typeof<Truck>)>] 
type Vehicle() = class end 
type Car() = inherit Vehicle() 
type Truck() = inherit Car() 

... powoduje błąd kompilatora: To nie jest stałe wyrażenie lub poprawna wartość niestandardowego atrybutu.

Odpowiedz

5

Powinieneś zaadresować zależność typu kołowego wprowadzoną przez użycie typu forward w atrybutach. Poniższy fragment pokazuje, jak można to zrobić w F #:

// Compiles OK 
[<AttributeUsage(AttributeTargets.All, AllowMultiple=true)>] 
type XmlInclude(t:System.Type) = 
    inherit System.Attribute() 

[<XmlInclude(typeof<Car>)>] 
[<XmlInclude(typeof<Truck>)>] 
type Vehicle() = class end 
and Car() = inherit Vehicle() 
and Truck() = inherit Car() 
2

Czy możesz spróbować ułożyć bardziej kompletny przykład, który daje błąd? Ja po prostu szybko próbował coś podobnego i to działa dobrze (w F # 3.0 w Visual Studio 2012):

type Car = C 

type XmlInclude(typ:System.Type) = 
    inherit System.Attribute() 

[<XmlInclude(typeof<Car>)>] 
let foo = 0 

Chyba istnieje jakiś drobny szczegół gdzieś, że myli F # kompilatora dla jakiegoś powodu - ale powinien zrozumieć typeof (który w rzeczywistości jest funkcją) i pozwala na jego wykorzystanie w atrybutach.

+0

Dziękujemy za potwierdzenie, że to * powinno * działać. Kiedy próbowałem utworzyć dla ciebie przykład testowy, stwierdziłem, że problem nie dotyczy używania ** typeof <...> ** w atrybucie. Problem polegał na tym, że klasy ** Car ** i ** Truck ** są zdefiniowane * po * klasie bazowej. – Wally

+1

@Wally W takim przypadku możesz potrzebować 'type ... i ...' do zdefiniowania typów rekursywnych (które widzą się nawzajem). –

Powiązane problemy