F# 4.0、.NET 4.6 を使用した次のコード スニペットを検討してください。
type X<'T> = Y of 'T
type XS = X<string>
type XI = X<int>
type X<'T when 'T :> string> with
static member X = 2
static member take (s: 'T) = s
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module XS =
let foo = 10
let create s = XS.Y s
let test = XI.take 2 // expected only string allowed, XI.take should not exist
型の拡張type X<'T when 'T :> string> with
が尊重されるか (この場合は、string
が封印されているか、 be に制限さ'T
れているため、エラーを意味しますstring
)、または構文エラーが発生することを期待します。
さらに、次の構文も使用できますが、これは通常の型定義 ( なしwith
)では構文エラーになります。
type X<'T> when 'T :> string with
static member X = 2
static member take (s: 'T) = s
私の推測では、拡張機能では制約が単純に無視されます。それは設計によるものですか?または、機能するはずですか?もしそうなら、どのように?
型拡張を少し試して、特定の具体的な型にのみ適用される特定のメソッドのセットを作成できるかどうか、またはさらに制限された具体的な型 (継承によっても実行できるもの) を作成できるかどうか疑問に思ったときに、これらすべてにたどり着きました。 )。