Согласно документации MSDN по для ... Переберите в F #:Для цикла не выводя целое число без знака
The type of the identifier is inferred from the type of the start and finish expressions. Types for these expressions must be 32-bit integers.
Но, с ниже код, я получаю следующее время компиляции ошибка:
for bar = 0u to 5u do
let baz : uint32 = bar
()
error FS0001: This expression was expected to have type
int
but here has type
uint32
Если я поставил петлю внутри последовательности, хотя, она компилируется без ошибок:
let foo =
seq {
for bar = 0u to 5u do
let baz : uint32 = bar
yield baz
}
val foo : seq<uint32>
Что происходит? Почему for-loop выводит uint32 во втором примере, но не в первую очередь?
У меня есть внешняя библиотека, которая принимает 32-битное целое число без знака в качестве индекса. Мне нужно перебирать от 0 до длины коллекции (также uint32) минус один. Когда я помещаю эту логику в последовательность и получаю каждый элемент, он компилируется без ошибок и работает просто отлично. Но когда я пытаюсь прочитать все элементы вне последовательности, компилятор бомбит. Я вынужден выполнить диалог типа от uint32 до int и обратно, что, на мой взгляд, имеет очень плохой запах.
Смотрите комментарии на связанный вопрос того, почему он работает в выражении последовательности. – Daniel
@ Daniel - uint32 - это 32-разрядное целое число. – JDB
Нет, это 32-разрядное _unsigned_ integer. 'int '- единственное 32-битное целое число. – Daniel