首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个表达式应该有IDataReader类型,但是这里有类型SqlDataReader

这个表达式应该有IDataReader类型,但是这里有类型SqlDataReader
EN

Stack Overflow用户
提问于 2015-01-09 20:38:43
回答 1查看 125关注 0票数 1

下面的代码没有在调用SqlDataReader时正确地将getReader的返回值转换为IDataReader我做错什么了?

代码语言:javascript
复制
open System.Data
open System.Data.SqlClient
open System.Configuration

type Foo = { id:int; name:string }

let populateFoo (r:IDataReader) =
    let o = r.GetOrdinal
    { id = o "id" |> r.GetInt32; name = o "name" |> r.GetString; }

let iter populateObject (r:IDataReader)  =
    match r.Read() with
    | true -> Some(populateObject r, r)
    | _    -> None

let iterFoo = iter populateFoo

let getReader : IDataReader =
    let cnstr = ConfigurationManager.ConnectionStrings.["db"].ConnectionString
    let cn = new SqlConnection(cnstr)
    let cmd = new SqlCommand("select * from Foo", cn)
    cmd.ExecuteReader()

let foos = Seq.unfold iterFoo getReader
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-09 21:00:48

F#不像C#那样自动上传,除非在某些特定的场景中(参见等级库,第14.4.2节)。

您必须显式转换表达式:cmd.ExecuteReader() :> IDataReader,然后可以在getReader之后删除类型注释。

或者,您可以将该函数保留为在调用站点返回一个SqlDataReader和upcast:

代码语言:javascript
复制
let foos = getReader :> IDataReader |> Seq.unfold iterFoo

如果unfold是具有类似于此签名的类型的静态成员:

代码语言:javascript
复制
type T() =
    static member unfold(a, b:IDataReader) = Seq.unfold a b

您将能够直接做T.unfold(iterFoo, getReader),它将自动上播。这是规范中提到的案例之一。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27868854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档