For loop For循环不推断无符号整数

For loop For循环不推断无符号整数,for-loop,f#,For Loop,F#,根据MSDN文档中关于。。。在F#中循环: 标识符的类型是从开始表达式和结束表达式的类型推断出来的。这些表达式的类型必须是32位整数 但是,通过下面的代码,我得到了以下编译时错误: 棒=0u至5u do的 设baz:uint32=bar () 错误FS0001:此表达式应具有类型 int 但这里有一种类型 uint32 但是,如果我将循环放在序列中,它编译时不会出错: let foo= 序号{ 对于bar=0u至5u do 设baz:uint32=bar 收益率 } valfoo:seq

根据MSDN文档中关于。。。在F#中循环:

标识符的类型是从开始表达式和结束表达式的类型推断出来的。这些表达式的类型必须是32位整数

但是,通过下面的代码,我得到了以下编译时错误:

棒=0u至5u do的

设baz:uint32=bar
()
错误FS0001:此表达式应具有类型
int
但这里有一种类型
uint32
但是,如果我将循环放在序列中,它编译时不会出错:

let foo=
序号{
对于bar=0u至5u do
设baz:uint32=bar
收益率
}
valfoo:seq
发生什么事了为什么for循环在第二个示例中推断uint32而不是第一个

我有一个外部库,它将无符号32位整数作为索引。我需要从0迭代到集合的长度(也是uint32)减1。当我将此逻辑放入序列中并生成每个项时,它编译时没有任何错误,运行正常。但是,当我试图读取序列之外的所有项时,编译器会爆炸。我被迫执行类型转换,从uint32到int再到int,在我看来,这有一种很难闻的味道。

正如Daniel在中解释的那样

。。。在一个计算表达式中,的
被分解为一个方法调用,它不像循环那样本质上是必需的,因此没有相同的限制

以下是一个简单的解决方法:

for bar in 0u .. 5u do
    let baz : uint32 = bar
    ()

有关为什么它在序列表达式中工作,请参见链接问题的注释。@Daniel-uint32是32位整数。不,它是32位无符号整数
int
是唯一的32位整数。@Daniel-好的。。。那么为什么它在一个序列中工作呢?正如在对另一个问题的评论中提到的,计算表达式被分解为方法调用。同样的限制并不适用。