2011-11-23 40 views
6

我寫了有內部列表的F#模塊:訪問從內C#代碼的F#名單

module MyModule 
type X = 
    { 
     valuex : float32 
    } 
let l = [ for i in 1 .. 10 -> {valuex = 3.3f}] 

現在從C#類我試圖訪問前面定義的列表,但我不」知道如何將它轉換:

... list = MyModule.l ; //here's my problem 

我需要這樣的:

IList<X> list = MyModule.l; 

我該如何做到這一點?

回答

9

簡單:

IList<MyModule.X> list = MyModule.l.ToList(); 

你需要的轉換方法,而不是數據類型轉換的原因/隱式轉換是因爲FSharpList<T>實現IEnumerable<T>但不IList<T>,因爲它代表一個不可變的鏈表。

請注意,您必須在您的C#項目中包含FSharp.Core作爲參考。

5

FSharpList<T>(這是F#list<T>類型的.Net名稱)不執行IList<T>,因爲它沒有意義。

IList<T>用於訪問和修改可以通過索引訪問的集合,其中list<T>不是。從C#中使用它,你可以明確地使用類型:

FSharpList<MyModule.X> l = MyModule.l; 
var l = MyModule.l; // the same as above 

或者你可以使用一個事實,即它實現IEnumerable<T>

IEnumerable<MyModule.X> l = MyModule.l; 

或者,如果你需要IList<T>,你可以使用LINQ的ToList(),爲安仁建議:

IList<MyModule.X> l = MyModule.l.ToList(); 

但是,你要記住,F#列表是不可改變的,所以沒有辦法進行修改。

+0

是的謝謝你的建議..我知道不可變的,但我不需要修改列表。只需檢索一些值以使用XNA和C#渲染即可 – Heisenbug