1

なぜ 2 行目でコンパイラ エラーが報告されるのだろうか

タイプ Relations は 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 は obj ではなく Relation として型指定されます

4

1 に答える 1

6

これはあなたが言ったことと完全に一致するわけではありませんが、シーケンス式が機能するが機能しないシナリオの 1 つSeq.mapは、型が実装されているSystem.Collections.IEnumerableSystem.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 に答える