2013-08-22 11 views
5

EDIT:問題を明らかにしたより完全な例を追加しました。F#属性、typeof、および "これは定数式ではありません"

.NETの属性によっては、タイプがTypeのものが必要です。 F#でこれらのパラメータをどのように宣言しますか?例えば

、C#で、私たちはこれを行うことができます:

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

しかし、F#で次のことを...

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

...コンパイラエラーで結果:これではありません定数式または有効なカスタム属性値。

答えて

5

属性の型の前方使用によって導入される循環型の依存性に対処する必要があります。以下のスニペットは、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

エラーを示すさらに完全な例をまとめてみることはできますか?私はすぐに似た何かをしようと、それは(Visual Studioの2012年にF#3.0で)正常に動作します:

type Car = C 

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

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

私はいくつかの理由のためのF#コンパイラを混乱どこかの小さなディテールがあると思います - しかし、それは(typeofを理解する必要があります実際には関数です)、属性での使用を許可します。

+0

*これは*動作するはずですか?あなたのためのテスト例をまとめようとしたときに、** typeof <...> **を属性に使用していないことがわかりました。問題は** Car **と** Truck **クラスが基本クラスの後に*定義されていることでした。 – Wally

+1

@Wallyその場合、再帰型(お互いに見える)を定義するには 'type ...と...'が必要です。 –

関連する問題