2009-11-24 23 views
2

只要它們共享一個公共基類而不投射每個返回值,是否有可能返回多個類型?F#函數具有多態性(在OO意義上)返回類型

例如:

[<AbstractClass>] 
type A() = 
    abstract Do : unit -> unit 

type B() = 
    inherit A() 
    override x.Do() =() 

type C() = 
    inherit A() 
    override x.Do() =() 

let getA i : A = 
    if i = 0 then new B() else new C() //Error: This expression was expected to have type A but here has type B 

回答

6

不,你要投:

let getA i : A = 
    if i = 0 then upcast new B() else upcast new C() 
+1

@Daniel如果你不想在任何地方施展,你可以使用工廠。 – gradbot 2009-11-25 01:58:33

+0

我想我可以稍微縮短到以下幾點? let getA i:A = upcast(if i = 0 then new B()else new C()) 我目前沒有可用的VS來試用它。 – Daniel 2009-11-28 22:33:47

1

我相信你可以使用泛型與約束來定義的「返回類型的當:> SOMETYPE但我現在必須開火VS來檢查。

編輯:不......詛咒......你必須施放。

相關問題