编辑:添加了一个更完整的示例,澄清了问题。
某些.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()
...导致编译器错误:这不是常量表达式或有效的自定义属性值。
答案 0 :(得分: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()
答案 1 :(得分: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
(实际上是一个函数)并允许它在属性中使用。