F# 此表达式应具有MemoryStream类型,但此处具有StreamWriter类型?

F# 此表达式应具有MemoryStream类型,但此处具有StreamWriter类型?,f#,f#-3.0,F#,F# 3.0,我正在尝试向FSharp.Data的Http模块()添加一个功能,以下载并保存一个文件(来自web响应流)。我修改了asyncReadToEnd函数,但得到以下错误。如果未提供streamWriter,定义函数asyncReadToEnd以便将其写入MemoryStream的最佳方法是什么 Error 1 This expression was expected to have type MemoryStream but here has type StreamW

我正在尝试向FSharp.Data的Http模块()添加一个功能,以下载并保存一个文件(来自web响应流)。我修改了asyncReadToEnd函数,但得到以下错误。如果未提供
streamWriter
,定义函数
asyncReadToEnd
以便将其写入
MemoryStream
的最佳方法是什么

Error 1 This expression was expected to have type MemoryStream but here has type StreamWriter 代码段:

  /// Read the contents of a stream asynchronously and return it as a string
  static let asyncReadToEnd (stream:Stream) isText streamWriter = async {
    // Allocate 4kb buffer for downloading dat
    let buffer = Array.zeroCreate (4 * 1024)
    use output = 
        match streamWriter with
        | Some (sw) -> sw
        | None -> new MemoryStream()
    let reading = ref true
    ....

  static member private InnerRequest(url:string, forceText, ?query, ?headers, ?meth, ?body, ?cookies, ?cookieContainer, ?certificate, ?streamWriter) = async {
    ....
    return! Http.augmentWebExceptionsWithDetails <| fun () -> async {
      use! resp = Async.FromBeginEnd(req.BeginGetResponse, req.EndGetResponse)
      use stream = resp.GetResponseStream()
      let! respBody = asyncReadToEnd stream (forceText || (isText resp.ContentType)) streamWriter
      let cookies = Map.ofList [ for cookie in cookieContainer.GetCookies uri |> Seq.cast<Cookie> -> cookie.Name, cookie.Value ]  
      let headers = Map.ofList [ for header in resp.Headers.AllKeys -> header, resp.Headers.[header] ]
      let statusCode = 
        match resp with
        | :? HttpWebResponse as resp -> int resp.StatusCode
        | _ -> 0
      return { Body = respBody
               Headers = headers
               ResponseUrl = resp.ResponseUri.OriginalString
               Cookies = cookies
               StatusCode = statusCode } }
  }

  static member AsyncRequestFile(url, (fileName:string), ?query, ?headers, ?meth, ?body, ?cookies, ?cookieContainer, ?certificate) = async {
    use sw = new StreamWriter(fileName)
    let! response = Http.InnerRequest(url, true, ?headers=headers, ?query=query, ?meth=meth, ?body=body, ?cookies=cookies, ?cookieContainer=cookieContainer, ?certificate=certificate, ?streamWriter=Some sw)
    return
        match response.Body with
        | ResponseBody.Text text -> text
        | ResponseBody.Binary binary -> failwithf "Expecting text, but got a binary response (%d bytes)" binary.Length
  }
///异步读取流的内容并将其作为字符串返回
静态let asyncReadToEnd(stream:stream)isText streamWriter=async{
//为下载dat分配4kb缓冲区
让buffer=Array.zeroCreate(4*1024)
使用输出=
将streamWriter与
|一些(sw)->sw
|无->新内存流()
让reading=ref为真
....
静态成员私有InnerRequest(url:string、forceText、query、Header、meth、body、cookies、cookieContainer、certificate、streamWriter)=异步{
....
return!Http.augmentWebExceptionsWithDetails异步{
使用!resp=Async.FromBeginEnd(req.BeginGetResponse,req.EndGetResponse)
使用stream=resp.GetResponseStream()
let!respBody=asyncReadToEnd stream(forceText | |(isText resp.ContentType))streamWriter
let cookies=Map.ofList[对于cookieContainer.GetCookies uri |>Seq.cast->cookie.Name,cookie.Value中的cookie]
让headers=Map.ofList[对于resp.headers.AllKeys->header中的header,resp.headers.[header]]
让状态代码=
匹配
|:?HttpWebResponse as resp->int resp.StatusCode
| _ -> 0
返回{Body=respBody
标题=标题
ResponseUrl=resp.ResponseUri.OriginalString
饼干=饼干
StatusCode=StatusCode}
}
静态成员AsyncRequestFile(url,(文件名:字符串),?查询,?标题,?方法,?正文,?cookies,?cookieContainer,?证书)=异步{
使用sw=新StreamWriter(文件名)
let!response=Http.InnerRequest(url,true,?headers=headers,?query=query,?meth=meth,?body=body,?cookies=cookies,?cookieContainer=cookieContainer,?certificate=certificate,?streamWriter=Some sw)
返回
将反应与身体匹配
|文本->文本
|ResponseBody.Binary Binary->failwithf“需要文本,但得到了二进制响应(%d字节)”Binary.Length
}

问题似乎在于:

use output = 
        match streamWriter with
        | Some (sw) -> sw
        | None -> new MemoryStream()
streamWriter
被推断为
MemoryStream选项
,因此
InnerRequest的
streamWriter
参数也是如此


当您在
AsyncRequestFile
中调用它时,您传递的是一个
StreamReader选项,因此出现了错误。

我了解错误是如何发生的。如果未提供
streamWriter
,如何设计代码,使代码使用
MemoryStream
use output = 
        match streamWriter with
        | Some (sw) -> sw
        | None -> new MemoryStream()