F#中的数组协方差

Dan*_*iel 5 .net arrays f# covariance

由于.NET数组是协变的,因此以下代码可在C#中工作:

var strArray = new string[0];
object[] objArray = strArray;
Run Code Online (Sandbox Code Playgroud)

在F#中,给定数组,'T[]将其转换为的最佳方法是什么obj[],而无需重新创建数组(例如Array.map box)?我正在使用(box >> unbox),但感觉很草率。

kvb*_*kvb 5

正如Brian所说,并没有什么错box >> unbox,除了数组协方差固有地被破坏(例如,([| "test" |] |> box |> unbox<obj[]>).[0] <- obj()在尝试执行分配时会抛出ArrayTypeMismatchException)。

相反,您可能最好将a string[]视为obj seq,这是绝对安全的(尽管它仍然需要在F#中进行装箱和拆箱,因为F#不支持通用协/反方差)。不幸的是,如果您走这条路线,确实会失去随机访问权限。

  • 我登录了ReadOnlyArray,请投票!http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2235515-readonly-array (2认同)

Bri*_*ian 4

box >> unbox
Run Code Online (Sandbox Code Playgroud)

似乎是个好主意; O(1),并且显然完成了这项工作。

还要考虑不要使用这个 CLR 错误功能。;)

  • 我想我可以使用“Array.map box”,但是当一个完美的错误功能可用时重新创建数组感觉是错误的。;-) (2认同)