В .NET массив 1D неявно реализует IList, что означает, что он также реализует (по наследству) IEnumerable<T>
.Итак, когда вы запускаете:
let t = Array.create 1 1.0
for x in t do printfn "%f" x;;
, компилятор F # выдает код, который получает реализацию IEnumerable<T>
(seq<T>
в F #) из t
, а затем перебирает его.Поскольку он может получить IEnumerable<T>
из массива, x
будет иметь тип T
.
С другой стороны, многомерные массивы (2d, 3d и т. Д.) Реализуют только IEnumerable
(не IEnumerable<T>
), поэтому компилятор F # выводит тип x
как System.Object
(или obj
в F #).
Существует два решения для того, что вы хотите:
Приведите каждое отдельное значение в цикле перед его печатью:
for x in t do printfn "%f" (x :?> float);;
Или используйте Seq.cast для создания и итерации по строго типизированному перечислителю:
for x in (Seq.cast<float> t) do printfn "%f" x;;