使用Seq.cast的问题

时间:2009-11-10 23:07:44

标签: .net f# seq

使用Seq.cast似乎经常失败,即使对于以下简单的事情也是如此:

let xor c = Seq.cast c |> Seq.reduce (^^^)
xor [1;3]       // Works, assuming because no cast is necessary
xor ['a';'b']   // Fails
xor [2u]        // Fails

后两者失败,Specified Cast无效。我错过了什么?

我正在尝试使用Seq.cast将一堆内容转换为uint16,但由于某种原因它总是失败(即使我用Seq.cast<uint32>注释它)。怎么了?

2 个答案:

答案 0 :(得分:7)

我认为这是因为Seq.cast只会输入强制转换,而不是强制类型:您需要Seq.map uint32 c |> Seq.reduce (^^^)

施法和强制之间的区别在于,当施法改变静态类型时,一个值被解释为不改变它的动态类型,(例如:我知道这个Animal实际上是Dog),胁迫创造一个全新的价值......至少从语言的角度来看。 CLR中的分割似乎几乎在值类型(强制)和引用类型(转换)之间,这使得保持直线更容易。

答案 1 :(得分:2)

另见

What does this C# code look like in F#? (part one: expressions and statements)

讨论了强制转换在C#中如何表示(至少)4种不同的操作,以及每种不同的操作如何映射到特定的F#功能。