gpt4 book ai didi

F#:向下转换 seq 到 IEnumerator

转载 作者:行者123 更新时间:2023-12-04 22:31:20 27 4
gpt4 key购买 nike

为什么在 F# 中,我可以做到这一点......

let s = seq { for i in 0 .. 4095 do yield i } :?> IEnumerator

...但这会抛出一个 System.InvalidCastException
let s = Seq.init 4095 (fun i -> i) :?> IEnumerator

最佳答案

序列表达式创建一个实现 IEnumerable<T>IEnumerator<T> 的对象

let s = seq { for i in 0 .. 4095 do yield i }
printfn "%b" (s :? IEnumerable<int>) // true
printfn "%b" (s :? IEnumerator<int>) // true

但是 Seq.init 没有:
let s = Seq.init 4095 (fun i -> i)
printfn "%b" (s :? IEnumerable<int>) // true
printfn "%b" (s :? IEnumerator<int>) // false

您可以重构代码以使用 IEnumerable<T> 而不是 IEnumerator ,因为这两种构造都会产生 IEnumerable<T>

或者,如果你真的想要一个 IEnumerator ,你可以简单地调用 GetEnumeratorEnumerator 返回一个 Enumerable :
let s = (Seq.init 4095 (fun i -> i)).GetEnumerator()
printfn "%b" (s :? IEnumerable<int>) // false
printfn "%b" (s :? IEnumerator<int>) // true

关于F#:向下转换 seq 到 IEnumerator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23143409/

27 4 0