我正在使用新的Task Parallel Library,今天就是这个案例:
此代码无法编译:
internal Task<Guid?> SavePages(string[] pages)
{
return Task.Run(() =>
{
if (pages == null || pages.Length == 0)
return null;
....
除非我明确地返回一个空可空的Guid:
internal Task<Guid?> SavePages(string[] pages)
{
return Task.Run(() =>
{
if (pages == null || pages.Length == 0)
return (Guid?)null;
// Check documents path access
为什么这种行为,我是在做错事?我的意思是,我得到代码使用第二个选项,但不知道如果我误用了库,我的意思是,null总是为空,不是吗?
编译错误:
无法将lambda表达式转换为委托类型 'System.Func'因为有些回归 块中的类型不可隐式转换为委托 返回类型
答案 0 :(得分:5)
这与编译器确定lambda类型的方式有关。返回普通null
时,编译器唯一可以暗示的是返回一个对象。因此,您的无参数lambda与Task<object>
兼容。但是,函数的签名表示您返回Task<Guid?>
,因此编译器从您的代码中隐含的返回类型不兼容。当您将null
强制转换为Guid?
时,您可以为编译器提供缺少的线索,使lambda成为Task<Guid?>
。
答案 1 :(得分:3)
这是C#编译器中类型推断的限制。这个问题与涉及三元运算符的问题无关:
int? num = a != null ? a.Value : null; // Will not compile
int? num = a != null ? a.Value : (int?)null; // Compiles
int? num = a != null ? (int?)a.Value : null; // Compiles
针对您的具体情况的另一种解决方法是明确指定泛型类型:
return Task.Run<Guid?>(() =>
{
if (pages == null || pages.Length == 0)
return null;