.net 在F中将枚举转换为列表、序列或泛型集合类型#

.net 在F中将枚举转换为列表、序列或泛型集合类型#,.net,f#,.net,F#,我有一个类型是字典列表或并发字典列表。我正试图创建一个get_nodes函数,但是当我从字典和concurrentdirectionary调用.Values时,函数返回不同的类型 因此,我需要以某种方式将这两种类型转换为相同的类型,以便F#编译 Dictionary.Values给出的类型是Dictionary'2.ValueCollection> 我发现这两种类型都有一个“GetEnumerator()”函数。我需要做的是以某种方式将枚举数转换为seq或list等 这是我的密码: sta

我有一个类型是
字典列表
并发字典列表
。我正试图创建一个
get_nodes
函数,但是当我从
字典和
concurrentdirectionary
调用
.Values
时,函数返回不同的类型

因此,我需要以某种方式将这两种类型转换为相同的类型,以便F#编译

Dictionary.Values
给出的类型是
Dictionary'2.ValueCollection>

我发现这两种类型都有一个“GetEnumerator()”函数。我需要做的是以某种方式将枚举数转换为seq或list等

这是我的密码:

   static member get_nodes (g:Graph<'a>) = 
        match g with 
        | Dictionary_Graph(nd,el) -> let n = nd.Values
                                     let enum = n.GetEnumerator()


        | ConcurrentDictionary_Graph(nd,el) -> let n = nd.Values
                                               let enum = n.GetEnumerator()
static member get_nodes(g:Graph您可能习惯于C#,它会自动将ValueCollection向上转换为ICollection(ValueCollection实现了ICollection)。F#不会这样做,因此您必须手动将Dictionary.Values的结果转换为ICollection

let n = nd.Values :> ICollection<Node<'a>>

希望他们不会"T添加它。显式强制转换代码更好、更清晰。自动强制转换和所有神奇的东西使代码更难推理,不仅仅是F#类型推理,也包括开发类型推理。@Gustavo.不同意。尝试使用Automapper或RavenDB之类的库,它们期望
表达式
用于类型安全属性规范。Beca使用没有向上转换功能,如果没有,您无法在F#中使用它。@KaseySpeakman:看起来大部分代码都是用于将F#引号转换为LINQ表达式的……不确定这与自动转换有什么关系。@Daniel,这是他们选择的解决问题的方法。但是,如果您尝试使用更基本的方法传入
fun x->x.Property
,编译失败(属性类型为
obj
的罕见情况除外)。并添加
x.Property:>obj
更改表达式类型,当库解析表达式时,该表达式需要属性访问,而不是强制转换。要使其工作,您必须手动构造
表达式并将其传入…或使用备用(非类型安全)方法。但并非所有库都提供此方法。
static member get_nodes (g:Graph<'a>) = 
    match g with 
    | Dictionary_Graph(nd,el) ->
        nd.Values :> ICollection<Node<'a>>
    | ConcurrentDictionary_Graph(nd,el) ->
        nd.Values
myGraph
|> Graph.get_nodes 
|> Seq.iter (fun x -> printfn "%A" x)