我想知道为什么第二行会报告编译器错误
类型的关系与seq<'a>
不兼容
而第一个推断r的类型为Relation。
type Microsoft.Office.Interop.Access.Dao.Database with
member x.f() =
let relations = [for r in x.Relations -> r]
let relations2 = x.Relations |> Seq.map id
()
使用for?
可以使用什么精确属性来循环关系// 编辑复制步骤:
我在VS2012中创建一个空白解决方案,添加对Microsoft.Office.Interop.Access.Dao的引用,并粘贴下面的代码。
module toto =
type Class1() =
member this.X = "F#"
type Microsoft.Office.Interop.Access.Dao.Database with
member x.f() =
let relations = [for r in x.Relations -> r]
let relations2 = x.Relations |> Seq.map id
()
r被输入为Relation,而不是obj
答案 0 :(得分:6)
这与你所说的并不完全相符,但是一个类型实现Seq.map
而不是System.Collections.IEnumerable
的情况下,序列表达式可以工作而不是System.Collections.Generic.IEnumerable<'T>
的一种情况(又名seq<'T>
)。例如,在此代码中,t
被推断为obj list
,但下一行不会编译。
type T() =
interface System.Collections.IEnumerable with
member x.GetEnumerator() = (Seq.init 10 id).GetEnumerator() :> _
let t = [for x in T() -> x]
let t2 = T() |> Seq.map id //ERROR: The type 'T' is not compatible with the type 'seq<'a>'
此方案对于在.NET 2.0之前创建的库特别常见。