繁体   English   中英

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#区分上传 - 转换为基类(总是正确的)和向下转换 - 强制转换为派生类(可能失败)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM