异步块内 CookieCollection 迭代中的编译错误

Compilation error in CookieCollection iteration inside Async block

我注意到在 Async 块内完成的 CookieCollection 迭代期间有一个奇怪的行为。基本上编译器无法推断集合的类型。

错误图片如下:

这是 F# compiler/editor 中的问题吗?

不,如错误所示,CookieCollection 未实现 IEnumerable<'a>,而仅实现非泛型 IEnumerable。您需要使用 Seq.cast<'a>:

for cookie in httpWebResponse.Cookies |> Seq.cast<Cookie> do
   ...

要让循环在异步块中工作,您需要先转换集合:

async {
    for c in httpWebResponse.Cookies |> Seq.cast<Cookie> do ()
}

这会将集合从 IEnumerable 转换为 IEnumerable<'T>。如您所见,在异步工作流之外使用此行时没有必要这样做:

for c in httpWebResponse.Cookies do ()

这是因为尽管语法相同,但这两个结构并不相同。

上面的是 'generic' 内置的 for 循环,它可以处理不同类型的集合(使用 IEnumerable 接口,但有一些注意事项,如 F# 3.0 spec 中所述,§ 6.5.6 序列迭代表达式)。异步块中的另一个是异步构建器的 For 方法,该方法明确定义为期望 seq<'a>(换句话说,IEnumerable<'T>)。

所以不,这不是错误。这是异步显示的内部结构。