2013-06-18 18 views
0

如果我有以下接口創建數組常量與F#的界面的各個子類

type IParameterizable = 
    abstract member Parameters : unit -> seq<Parameter> 

然後,我有一些工廠,創造IParameterizable

的各個子類
let MakeA arg = ... 
let MakeB arg = ... 
let MakeC arg = ... 

其中A ,B,C是IPa可參數化的子類。現在,如果我想使一個數組 字面

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

編譯器會抱怨,他們是不同類型的。但是,如果我這樣做

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

這個工程,但是有點忙於眼睛。顯而易見的解決方案是讓工廠返回IParameterizable而不是具體類,但在其他情況下,我需要具體類而不是接口。

有沒有辦法只指定一次數組的類型,然後所有元素 將被隱式轉換或編譯器錯誤(如果轉換不可能)。

回答

4

訣竅是定義分配給所述

變量的類型然後
let contents:IParameterizable array = 
      [| MakeA 0 
      ; MakeB 1 
      ; MakeC 2 
      |] 

類型推斷踢的字面和鎖定下來。

+0

我想你也可以使用推斷的upcast功能:'MakeA 0:> _'。 – MisterMetaphor

+0

@bradgonesurfing如果它解決了您的問題,您應該將其標記爲答案 – paul

+0

我必須等待幾天才能讓系統標記我自己的答案爲正確答案。 – bradgonesurfing