2

基本的に、次のコード行がコンパイルされない理由を尋ねています。

type IGenericType<'a> = 
    abstract member MyFunc : 'a -> 'a -> 'a

type Implementer() = 
    member x.Test () () = () // unit->unit->unit
    interface IGenericType<unit> with 
        member x.MyFunc a b = b // FS0017
        // member x.MyFunc () () = () // FS0017

これを意図したとおりに機能させる方法があるかどうか、ただ興味があります。これは、ユニットとジェネリックの実装に関係する制限だと思います。

現時点では、次の回避策を使用しています。

type Nothing = 
    | Nothing
type Implementer() = 
    interface IGenericType<Nothing> with 
        member x.MyFunc a b = b

誰かがこの行動に光を当ててくれることを願っています。

4

1 に答える 1

2

あなたはそれを正しく推測しました。.NET フレームワーク内の相互運用性のために、F# コンパイラは IL を発行せず、代わりunitにそれを置き換えvoidます。

したがって、ジェネリック インターフェイスは、 以外のすべての型で機能しますunit。大きな問題ではないようです。あなたの回避策は、この問題の優れた解決策です。

より詳細な説明は、 unit による F# インターフェースの継承の失敗で見つけることができます。

于 2012-04-04T13:43:55.423 に答える