2017-05-24 8 views
2

私はこのエラーメッセージは別に、私はしません(でもこの上の他のすべてのSOの質問を読んだ後)という事実からなぜこのコードは十分に一般的ではないか、それともさらに優れているのですか?

This code is not sufficiently generic. 
The type variable ^T could not be generalized 
because it would escape its scope. 

あるToBar

type Foo = {foo: string} 
type Bar = {bar: string} 

[<AbstractClass>] 
type AbstractType< ^T> (fn: ^T -> Foo) = 

    member inline this.ToFoo (x: ^T) = fn x 
    abstract ToBar: string -> Bar 

の定義にエラーが発生しますこのエラーが私に教えてくれるものを入手してください...しかし、そのタイプパラメータを使用していないToBarでもエラーが発生しています

答えて

4

これは、ToBarがではないために発生しますです。これは、静的に解決された型制約を使用するための必須要素です。しかし、あなたは本当にそれらを必要としないようだ、単純なジェネリックで十分だろう。だから'T^Tを交換し、それが正常に動作します:あなたは、もう少しそれについて考える

[<AbstractClass>] 
type AbstractType<'T> (fn: 'T -> Foo) = 

    member inline this.ToFoo (x: 'T) = fn x 
    abstract ToBar: string -> Bar 

場合は、それだけで理にかなっています:abstractメンバーは本当にSRTCを利用することができない、それはで派遣しているためランタイム、およびSRTCタイプをコンパイル時に知る必要があります。関連ノートで

、あなたがSRTCを保つための努力のToBarを取り除く場合でも、あなたは次のエラーをヒットされます:

error FS1113: The value 'ToFoo' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible 

これは型自体は民間することによって固定することができます。

type private AbstractType< ^T> (fn: ^T -> Foo) = 
    member inline this.ToFoo (x: ^T) = fn x 

外部アセンブリからアクセスできないため、SRTCパラメータを公開する必要がないため、これは機能します。

関連する問題