我注意到在异步块内完成的CookieCollection迭代过程中出现了奇怪的行为。基本上编译器无法推断集合的类型。
跟随错误的图像:
这是F#编译器/编辑器中的问题吗?
答案 0 :(得分:3)
要使循环在异步块中工作,您需要首先强制转换集合:
async {
for c in httpWebResponse.Cookies |> Seq.cast<Cookie> do ()
}
这会将集合从IEnumerable
转换为IEnumerable<'T>
。如您所见,在异步工作流程之外使用此行时不需要这样做:
for c in httpWebResponse.Cookies do ()
这样做的原因是这两个结构不尽相同,尽管语法相同。
上面的一个是'泛型'内置for
循环,它可以处理不同类型的集合(使用IEnumerable接口时有一些警告,如F# 3.0 spec,§6.5.6序列中所述迭代表达式)。异步块中的另一个是异步构建器的For
方法,并且该方法被明确定义为期望seq<'a>
(换句话说,IEnumerable<'T>
)。
所以不,这不是一个错误。这是异步显示的内部结构。
答案 1 :(得分:1)
不,如错误所示,CookieCollection
不会实现IEnumerable<'a>
,而只会实现非通用IEnumerable
。您需要使用Seq.cast<'a>
:
for cookie in httpWebResponse.Cookies |> Seq.cast<Cookie> do
...