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
根据本站点上的第 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