【发布时间】:2017-09-19 11:26:38
【问题描述】:
来自Array Covariance文章:
元素类型为引用类型的数组是协变的。 [...] 它被添加到 CLR 是因为 Java 需要它并且 CLR 设计者希望能够支持类似 Java 的语言。
CLR 支持数组协方差,但如何在 F# 中使用这个方便的功能?
type Foo () = class end
type Bar () = inherit Foo ()
// must have type Foo []
let foo : Foo [] = Array.create 1 (Bar ())
// ^^^^^^ must not cast to Foo
// must throw ArrayTypeMismatchException
foo.[0] <- Foo ()
在示例中,我想让 foo 在后台存储一个 Bar 数组,就像在 CLR 中实现的那样。
【问题讨论】:
-
为什么要这样做?通常,F# 故意 避免了隐式类型转换的情况,数组协变就是其中之一。因此,虽然它在 C# 中可能是允许的,但在 F# 中故意困难(尽管并非不可能),并且您需要了解该语言的来龙去脉才能使用它。由于从您迄今为止提出的问题来看,您似乎对 F# 比较陌生,因此我的第一个建议是不要尝试使用数组协方差,而是找到其他解决方案(可能涉及有区别的联合)来您要解决的问题。
-
@rmunn 只要不是不可能,我想试试如何在F#中做数组协方差。
标签: c# .net f# functional-programming clr