1

我想知道为什么第二行报告编译器错误

类型关系与 seq<'a> 不兼容

而第一个推断 r 的类型关系。

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

4

1 回答 1

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 之前创建的库尤其常见。

于 2013-10-03T14:31:59.667 回答