F#:当B是A的子类型时,为什么我不能将类型B的对象包含在类型A的列表中?

时间:2015-01-14 23:08:28

标签: f#

根据此站点http://msdn.microsoft.com/en-us/library/dd233224.aspx上的第3个示例,只要两个类型派生自相同的超类型,F#列表就可以包含不同类型的对象。但是,我无法使用cons(::)运算符将子类型添加到超类型列表

module test

type A() =
    member this.x = 2

type B() =
    inherit A()
    member this.y = 4

let mutable myList : A list = []
myList <- [B()] // Valid
myList <- B()::myList // Invalid: This expression was expected to have type A but here has type B

我有理由不能使用::附加到列表中吗?

1 个答案:

答案 0 :(得分:3)

F#并不总是自动插入向上转换(转换为基本类型),因此您必须插入一个显式转换,将B值转换为A类型的值。

请注意,F#区分 upcasts - 强制转换为基类(总是正确的)和向下转换 - 强制转换为派生类(可能会失败)。

您可以使用upcast关键字,也可以使用expr :> Type表示法。在这两种情况下,编译器都可以填写所需的目标类型,因此您只需编写:

myList <- (upcast B())::myList
myList <- (B() :> _)::myList