6

編集:問題を明確にした、より完全な例を追加しました。

一部の .NET 属性には、 type のパラメーターが必要です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()

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

4

2 に答える 2

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()
于 2013-08-22T13:43:38.610 に答える
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、(実際には関数である) 理解して、属性で使用できるようにする必要があります。

于 2013-08-22T01:44:41.727 に答える