호출에서 다음 코드는 SqlDataReader
의 반환 값을 getReader
에서 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)에서는'Upcasting이 자동으로 적용됩니다. 인수를 객체 유형의 메소드에 전달합니다. 그러나 모듈에서 let-bound 함수의 경우 매개 변수 유형이 플랙시 블 유형으로 선언되지 않는 한 업 캐스팅은 자동이 아닙니다. 그래서 아마도'populateFoo (r : #IDataReader)'가 작동할까요? – Rhumborl