异步块内 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>
)。
所以不,这不是错误。这是异步显示的内部结构。
我注意到在 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>
)。
所以不,这不是错误。这是异步显示的内部结构。