次のインターフェースがある場合
type IParameterizable =
abstract member Parameters : unit -> seq<Parameter>
次に、IParameterizable のさまざまなサブクラスを作成するいくつかのファクトリがあります。
let MakeA arg = ...
let MakeB arg = ...
let MakeC arg = ...
ここで、A、B、C は IParameterizable の子クラスです。配列リテラルを作成したい場合
let contents = [| MakeA 0; MakeB 1; MakeC 2 |]
コンパイラは、それらが異なる型であると不平を言います。しかし、もしそうなら
let contents = [| MakeA 0 :> IParameterizable
; MakeB 1 :> IParameterizable
; MakeC 2 :> IParameterizable
|]
これは機能しますが、目には少し忙しいです。明らかな解決策は、ファクトリが具象クラスではなく IParameterizable を返すようにすることですが、それ以外の場合は、インターフェイスではなく具象クラスが必要です。
配列の型を 1 回だけ指定すると、すべての要素が暗黙的にキャストされるか、キャストが不可能な場合はコンパイラ エラーが発生する方法はありますか。