1

如果我有以下界面

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 而不是具体类,但在其他情况下,我需要具体类而不是接口。

有没有办法只指定一次数组的类型,然后所有元素都将被隐式转换,或者如果转换是不可能的,则会出现编译器错误。

4

1 回答 1

4

诀窍是定义分配给的变量的类型

let contents:IParameterizable array = 
           [| MakeA 0 
            ; MakeB 1 
            ; MakeC 2 
            |]

类型推断然后启动文字并将其锁定。

于 2013-06-18T18:07:28.257 回答