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

F#: Why can't I cons an object of type B to a list of type A when B is a subtype of A?

根据本站点上的第 3 个示例 http://msdn.microsoft.com/en-us/library/dd233224.aspx,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

为什么我不能使用 :: 附加到列表?

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

请注意,F# 区分 upcasts - 转换为基础 class(始终正确)和 downcasts -强制转换为派生的 class(可能会失败)。

您可以使用 upcast 关键字,也可以使用 expr :> Type 符号。在这两种情况下,编译器都可以填写所需的目标类型,所以你可以这样写:

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