2011-11-23 14 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