为什么Task不返回null

时间:2012-07-01 19:14:22

标签: c# task-parallel-library

我正在使用新的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'因为有些回归   块中的类型不可隐式转换为委托   返回类型

http://msdn.microsoft.com/en-us/library/dd460717.aspx

2 个答案:

答案 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;