2014-02-21 158 views
0

我有這個接口在C#編寫...F#編譯錯誤實現C#接口

public interface IFoo { 
    IEnumerable<T> Bar<T>(IEnumerable<T> list); 
} 

一個簡單的C#實現是直接...

public class CsFoo : IFoo 
{ 
    public IEnumerable<T> Bar<T>(IEnumerable<T> list) 
    { 
     return list; 
    } 
} 

一個簡單的F#的實現也很簡單,當...

type FsFoo() = 
    interface IFoo with 
     member this.Bar list = 
      list 

但是,當我嘗試比賽列表 ...

type FsFoo() = 
    interface IFoo with 
     member this.Bar list = 
      match list with 
       | [] -> []  // error      
       | list -> list 

我得到這個錯誤...

這種表達預計有型 System.Collections.Generic.IEnumerable <「一>但這裏有鍵入'b列表

你能幫我理解這個錯誤嗎?我該如何改變F#代碼來修復它?

謝謝...

+1

您正在嘗試使用列表模式與序列相匹配。其實,這個錯誤說得相當清楚。 如果你想使用列表模式匹配,你必須將序列轉換爲列表:'list |> Seq.toList'。 –

回答

3

你的界面不使用列表,它使用IEnumerable<T>正因爲如此,在F#接口打交道時,你應該使用Seq

type FsFoo() = 
    interface IFoo with 
     member this.Bar list = 
      match Seq.isEmpty list with 
       | true -> Seq.empty  // input is empty    
       | false -> list   // input is not empty 

但它實際上是沒有意義的,因爲它只是傳遞的參數值作爲結果值,所以它是完全一樣的

type FsFoo() = 
    interface IFoo with 
     member this.Bar list = list 
+0

好的。這就說得通了。 (但也許我錯誤地設計了一個例子,導致錯誤信息與我在實際程序中看到的錯誤信息重複,但並不代表我的實際問題。) – AlfredBr