从C#代码中访问F#列表

Hei*_*bug 6 c# f# types list

我写了一个F#模块,里面有一个列表:

module MyModule
type X = 
    {
        valuex : float32
    }
let l = [ for i in 1 .. 10 -> {valuex =  3.3f}]
Run Code Online (Sandbox Code Playgroud)

现在从C#类我试图访问以前定义的列表,但我不知道如何转换它:

... list = MyModule.l ; //here's my problem
Run Code Online (Sandbox Code Playgroud)

我需要这样的东西:

IList<X> list = MyModule.l;
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Ani*_*Ani 10

很简单:

IList<MyModule.X> list = MyModule.l.ToList();
Run Code Online (Sandbox Code Playgroud)

您需要转换方法而不是强制转换/隐式转换的原因是因为它FSharpList<T>实现IEnumerable<T>但不是IList<T>因为它表示不可变的链表.

请注意,您必须FSharp.Core在C#项目中包含作为参考.


svi*_*ick 5

FSharpList<T>(这是F#的净名称list<T>类型)没有实现IList<T>,因为它没有任何意义.

IList<T>用于访问和修改可以通过索引访问的集合,而list<T>不是.要从C#中使用它,您可以显式使用该类型:

FSharpList<MyModule.X> l = MyModule.l;
var l = MyModule.l; // the same as above
Run Code Online (Sandbox Code Playgroud)

或者您可以使用它实现的事实IEnumerable<T>:

IEnumerable<MyModule.X> l = MyModule.l;
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实需要IList<T>,可以使用LINQ ToList(),就像Ani建议的那样:

IList<MyModule.X> l = MyModule.l.ToList();
Run Code Online (Sandbox Code Playgroud)

但是你必须记住F#list是不可变的,所以没有办法修改它.