C# F#-在字典上使用Linq SelectMany不会';I don’我没有按预期工作

C# F#-在字典上使用Linq SelectMany不会';I don’我没有按预期工作,c#,generics,f#,C#,Generics,F#,我希望下面的两个代码段都能工作,但是F#one没有为SelectMany找到重载 //C# var aaa = new Dictionary<string, List<string>>(); Func<KeyValuePair<string, List<string>>, List<string>> fff = (KeyValuePair<string, List<string>> kvp) =>

我希望下面的两个代码段都能工作,但是F#one没有为SelectMany找到重载

//C#
var aaa = new Dictionary<string, List<string>>();
Func<KeyValuePair<string, List<string>>, List<string>> fff = (KeyValuePair<string, List<string>> kvp) => kvp.Value;
var bbb = aaa.SelectMany(fff);

//F#
let aaa = new Dictionary<string, List<string>>()
let fff = Func<_, _>(fun (kvp:KeyValuePair<string, List<string>>) -> kvp.Value)
let bbb = aaa.SelectMany(fff) //Error   FS0041  No overloads match for method 'SelectMany'

/C#
var aaa=新字典();
Func fff=(KeyValuePair kvp)=>kvp.Value;
var bbb=aaa。选择多个(fff);
//F#
让aaa=新字典()
让fff=Func(fun(kvp:KeyValuePair)->kvp.Value)
让bbb=aaa.SelectMany(fff)//错误FS0041方法“SelectMany”没有重载匹配
有人知道为什么吗?请注意,fff在两个代码段中具有相同的类型,看起来F#要求您显式地将返回类型强制转换为
IEnumerable
,因此这将起作用:

let aaa = new Dictionary<string, List<string>>()
let fff = Func<_, _>(fun (kvp:KeyValuePair<string, List<string>>) -> kvp.Value :> IEnumerable<_>)
let bbb = aaa.SelectMany(fff)
let aaa=new Dictionary()
让fff=Func(fun(kvp:KeyValuePair)->kvp.Value:>IEnumerable)
设bbb=aaa。选择多个(fff)
或者,更简单地说:

let aaa = new Dictionary<string, List<string>>()
let bbb = aaa.SelectMany(fun kvp -> kvp.Value :> IEnumerable<_>)
let aaa=new Dictionary()
让bbb=aaa.SelectMany(有趣的kvp->kvp.Value:>IEnumerable)
但是,如上所述,在F#中使用
Seq
模块而不是LINQ更为惯用。

看起来F#需要显式地将返回类型强制转换为
IEnumerable
,因此这将起作用:

let aaa = new Dictionary<string, List<string>>()
let fff = Func<_, _>(fun (kvp:KeyValuePair<string, List<string>>) -> kvp.Value :> IEnumerable<_>)
let bbb = aaa.SelectMany(fff)
let aaa=new Dictionary()
让fff=Func(fun(kvp:KeyValuePair)->kvp.Value:>IEnumerable)
设bbb=aaa。选择多个(fff)
或者,更简单地说:

let aaa = new Dictionary<string, List<string>>()
let bbb = aaa.SelectMany(fun kvp -> kvp.Value :> IEnumerable<_>)
let aaa=new Dictionary()
让bbb=aaa.SelectMany(有趣的kvp->kvp.Value:>IEnumerable)
然而,如上所述,在F#中使用
Seq
模块而不是LINQ更为惯用。

我的问题是“为什么”而不是“如何”。其他答案间接给出了解决方案,但原始问题的答案如下:

“SelectMany要求函数返回IEnumerable,而fff返回List。C允许通过隐式强制转换直接使用fff,F更严格,需要显式强制转换”

我的问题是“为什么”而不是“如何”。其他答案间接给出了解决方案,但原始问题的答案如下:

“SelectMany要求函数返回IEnumerable,而fff返回List。C允许通过隐式强制转换直接使用fff,F更严格,需要显式强制转换”

可用重载:-(扩展名)IEnumerable.SelectMany(选择器:Func>):IEnumerable):IEnumerableinq在F代码库中非常罕见,因为有
Seq
模块,它允许用更惯用的代码做同样的事情。考虑使用@ JL0PD,问题不是“如何做到这一点”,而是“为什么会发生这种情况”。可用的重载:-(扩展)I枚举。SelectMany(选择器:FUNC>):I枚举):IEnumerableLINQ在F代码库中非常罕见,因为有“代码> SEQ < /代码>模块,它允许用更惯用的代码来做相同的事情。考虑使用@ JL0PD,问题不是“如何做到这一点”,而是“为什么会发生这种情况”。