我有以下代码
[Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void TestEnumOfMaybe()
{
List<Maybe<int>> l = new List<Maybe<int>>();
l.Add(1.ToMaybe());
l.Add(Maybe.None<int>());
l.Add(3.ToMaybe());
var y = from x in l
from y in x
select y;
}
Run Code Online (Sandbox Code Playgroud)
我的Maybe类型接受所有Select和SelectMany方法使Linq兼容,我有测试来证明这一点.但是,我似乎无法找到一种方法来进行交叉类型LINQ组合,如上面的测试用例.我得到的错误是
expression of type 'FunctionalExtensions.Maybe<int>' is not allowed in
a subsequent from clause in a query expression with source type
'System.Collections.Generic.List<FunctionalExtensions.Maybe<int>>'.
Type inference failed in the call to 'SelectMany'.
FunctionalExtensions*
Run Code Online (Sandbox Code Playgroud)
有没有办法结合两种LINQ类型或我运气不好?完整的Maybe.cs实现是在
这个翻译:
// Changed variable from y to query for clarity
var query = from x in l
from y in x
select y;
Run Code Online (Sandbox Code Playgroud)
很简单:
var query = l.SelectMany(x => x, (x, y) => y);
Run Code Online (Sandbox Code Playgroud)
请注意,此处没有调用任何内容y.
现在l是一个List<Maybe<int>>,所以你需要尝试找到一个SelectMany在这里有效的合适方法.除非你已经添加了它,否则它会查找Enumerable.SelectMany,并且每次重载都需要第一个委托来返回IEnumerable<T>一些T.
所以这就是为什么它不起作用.你可以通过制作Maybe<T>工具IEnumerable<T>(大概产生一个结果或没有结果)使它工作.很难确定这是否是你的目标,但你基本上必须让这种扩展发挥作用.
或者,您可以为SelectMany目标编写新的重载IEnumerable<T>,对于结果是a Maybe<T>而不是a的情况IEnumerable<T>.IMO,这将是非常不直观的.