3

C#で作成されたライブラリを使用しています。私はいくつかのコードをF#に移植することに取り組んできましたが、C#ライブラリからかなりの数の基礎となる型を使用する必要があります。

1つのコードで値のリストを計算し、それをクラスのパブリックフィールド/プロパティに割り当てる必要があります。このフィールドは、2つのICollectionを含むC#クラスです。

私のF#コードは正常に機能し、F#Seq/Listを返す必要があります。

次のコードスニペットを試してみましたが、それぞれエラーが発生します。

  • F#メンバーの戻りタイプは、recoverieslistタイプのrecoveryListと呼ばれるタイプです。
  • 2つのICollectionオブジェクトを含むクラス自体であるクラスのパブリックフィールド

    this.field.Collection1 = recoveries
    

これにより、エラーが発生します。タイプはICollectionであると予想されますが、タイプはリカバリリストです。

this.field.Collection1 = new ResizeArray<Recoveries>()

エラーが予想されるタイプICollectionを提供しますが、ResizeArrayです

this.field.Collection1 = new System.Collections.Generic.List<Recoveries>()

上記と同じエラー-ICollectionが必要ですが、タイプはListです

何か案は?これらの操作はC#の観点からは有効であるように見え、List / ResizeArrayはICollectionを実装しているため、値を割り当てる方法がわかりません。

基になるC#ライブラリのタイプを変更することもできますが、これには他の影響がある可能性があります。

ありがとう

4

1 に答える 1

7

F#はC#のような暗黙的なキャストを行いません。したがってSystem.Collections.Generic.List<'T>、インターフェイスを実装していても、一部の型付きプロパティをのインスタンスに直接設定ICollectionすることはできません。ICollectionSystem.Collections.Generic.List<'T>

ICollectionただし、修正は簡単です。必要なのは、ResizeArray<'T>またはSystem.Collections.Generic.List<'T>を割り当てる前に、明示的なアップキャストを追加することだけです。

// Make sure to add an 'open' declaration for System.Collections.Generic
this.field.Collection1 = (recoveries :> ICollection)

また

this.field.Collection1 = (ResizeArray<Recoveries>() :> ICollection)
于 2013-02-16T17:13:14.333 に答える