3

使用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>)。这是怎么回事?

4

2 回答 2

8

我相信这是因为Seq.cast只会做类型转换,而不是类型强制你想要。Seq.map uint32 c |> Seq.reduce (^^^)

强制转换和强制转换之间的区别在于,虽然强制转换改变了静态类型,但一个值被解释为不改变它的动态类型,(例如:我知道这Animal真的是 a Dog),强制创建一个全新的值......至少从语言观点看法。CLR 中的拆分似乎在值类型(强制)和引用类型(强制转换)之间进行,这使得保持直线变得更容易一些。

于 2009-11-10T23:40:13.880 回答
3

也可以看看

这个 C# 代码在 F# 中是什么样子的?(第一部分:表达式和语句)

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

于 2009-11-11T01:06:36.343 回答