使用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>
注释它)。怎么了?
答案 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#功能。