Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用Seq.cast时出现问题_.net_F#_Seq - Fatal编程技术网

.net 使用Seq.cast时出现问题

.net 使用Seq.cast时出现问题,.net,f#,seq,.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 后两个失败与指定的强制转换无效。我错过了什么 我试图使用Seq.cast将一堆东西转换为uint16,但由于某种原因

使用
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
后两个失败与指定的强制转换无效。我错过了什么


我试图使用
Seq.cast
将一堆东西转换为
uint16
,但由于某种原因,它总是失败(即使我用
Seq.cast
注释它)。这是怎么回事?

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

施法和强制之间的区别在于,当施法改变静态类型时,一个值被解释为不改变其动态类型(例如:我知道这个
动物
实际上是一只
),强制创建了一个全新的值。。。至少从语言的角度来看。CLR中的拆分似乎主要在值类型(强制)和引用类型(强制转换)之间进行,这使得保持正确性更容易一些。

另请参见


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

哦,我明白了。Seq.cast试图将容器而不是其内容强制转换为非完全:虽然
Seq.cast['a';'b']
确实将
char-Seq强制转换为
uint32-Seq
(甚至成功),但在枚举值时会发生错误:读取
IEnumerable.Current
属性时,它尝试将
char
强制转换为
uint32
,但失败了,因为它需要使用
uint32
函数强制转换。我的意思是
IEnumerator
,当然不是
IEnumerable
。如果不清楚的话,
Seq
只是
IEnumerable
的别名。我很害怕。我有
c |>Seq.map uint32 |>Seq.reduce(^^^)
解决方案,但我想知道为什么这个示例失败了。谢谢你的回复。