2014-05-16 22 views
2

我一直在試驗F#,並認爲,作爲一種學習練習,我可以獲得現有的c#項目並用F#版本逐個替換類。當我嘗試使用F#'class'類型實現泛型C#接口時,我遇到了麻煩。在f#中實現c#接口:無法獲得正確的類型

C#接口

public interface IFoo<T> where T : Thing 
    { 
     int DoSomething<T>(T arg); 
    } 

試圖執行F#。我有各種版本,這是最接近(給我的錯誤信息最少的)

type Foo<'T when 'T :> Thing> = 
    interface IFoo<'T> with 
     member this.DoSomething<'T>(arg) : int = 
      45 

編譯錯誤我現在得到的是:

成員「DoSomething的<」 T> :'T - > int'沒有正確的 類型來覆蓋相應的抽象方法。所需的 簽名是'DoSomething <'T>:'T0 - > int'。

這讓我感到莫名其妙。什麼是'T0?更重要的是,我如何正確實施這個成員?

回答

7

首先,通用參數爲DoSomething會在IFoo<T>接口上隱藏類型參數T。你可能想使用:

public interface IFoo<T> where T : Thing 
{ 
    int DoSomething(T arg); 
} 

一旦你這樣做,你可以實現與接口:

type Foo<'T when 'T :> Thing> = 
    interface IFoo<'T> with 
     member this.DoSomething arg = 45 

如果沒有打算陰影類型參數的C#接口上,上述定義將仍然有效,編譯器將根據需要推斷arg的類型爲'a而不是T :> Thing

+2

更直接的是,您需要提供定義它的泛型參數,而不是它被引用的地方。 – mydogisbox

相關問題