作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于 .NET 数组是协变的,以下在 C# 中有效:
var strArray = new string[0];
object[] objArray = strArray;
'T[]
,将其转换为
obj[]
的最佳方法是什么? ,而不重新创建数组(例如,
Array.map box
)?我正在使用
(box >> unbox)
,但感觉很草率。
最佳答案
正如布赖恩所说,box >> unbox
没有任何问题。 ,除此之外,数组协方差本身就被破坏了(例如,([| "test" |] |> box |> unbox<obj[]>).[0] <- obj()
在尝试执行赋值时会抛出一个 ArrayTypeMismatchException)。
相反,您最好处理 string[]
作为 obj seq
,这是完全安全的(尽管它仍然需要在 F# 中装箱和拆箱,因为 F# 不支持通用协方差/反方差)。不幸的是,如果你走这条路,你会失去随机访问。
关于.net - F#中的数组协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7339013/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!