Async块内的CookieCollection迭代中的编译错误

时间:2015-01-18 19:55:10

标签: visual-studio f#

我注意到在异步块内完成的CookieCollection迭代过程中出现了奇怪的行为。基本上编译器无法推断集合的类型。

跟随错误的图像:

enter image description here

这是F#编译器/编辑器中的问题吗?

2 个答案:

答案 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
   ...