以下代码不会将我的返回值SqlDataReader
从getReader
正确地转换为调用Seq.unfold
时的IDataReader
。 我在做什么错?此表达式预计具有IDataReader类型,但此处具有SqlDataReader类型
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
我根本不知道F#,但是[MSDN](http://msdn.microsoft.com/en-us/library/dd233220.aspx#code-snippet-4)说'当你上传时自动应用上传将参数传递给对象类型上的方法。但是,对于模块中的let-bound函数,上传不是自动的,除非参数类型被声明为灵活类型。所以也许'populateFoo(r:#IDataReader)'会工作吗? – Rhumborl 2015-01-09 21:00:11