以下代碼不會將我的返回值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