6

编辑:添加了一个更完整的示例,它澄清了问题。

某些 .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()

...导致编译器错误:这不是常量表达式或有效的自定义属性值。

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 回答