【发布时间】:2017-08-28 20:55:42
【问题描述】:
(与my previous question相关)
我正在使用 C# 中的语言扩展库并试图让 Tasks 返回 Either 值以正确组合并且在类型推断方面遇到困难。它只是没有按照我的预期进行。
这里涉及到三种方法:
-
Initialization:返回Task<Either<Exception, ADUser>> -
createUserMapping:接受ADUser并返回Either<Exception, UserMapping> -
AddUser:接受UserMapping并返回Task<Either<Exception, int>>
我想返回AddUser 的结果。看起来很简单。不过,不知何故,这些类型并没有排成一行。
我现在拥有的是这样的:
return Initialization
.Bind(eu => eu.Bind(createUserMapping).AsTask())
.Bind(eu => eu.Bind(async u => await AddUser(u)));
但是,虽然 Intellisense 告诉我最后一个异步 lambda 中的 u 是 UserMapping 类型,但当它被传递到 AddUser 调用时,我得到了错误:
Argument 1: cannot convert from 'System.Exception' to 'UserMapping'
为什么编译器在 lambda 开始时对参数的类型没有混淆?有没有更好的方法让它发挥作用?
我尝试过使用BindT 以及LINQ 表达式的变体。我似乎无法解决这个问题。
【问题讨论】:
-
这里使用的
Bind方法的签名是什么? 4个方法一样吗?两个lambas中eu的类型是什么?我认为您不想在最后一个羔羊等待,而只是返回Task。 -
@JamesFaix,问题出在我使用的库版本中。我试图避免使用 beta 版本,但如果我想让它工作,我必须迁移到 2.0。类型是正确的,但库只是在 1.9 版中没有合作。在 2.0+ 时确实如此。
标签: c# functional-programming async-await