4

我正在使用新的任务并行库,今天去了这个案例:

此代码无法编译:

    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 始终为 null,不是吗?

编译错误:

无法将 lambda 表达式转换为委托类型“System.Func”,因为块中的某些返回类型不能隐式转换为委托返回类型

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

4

2 回答 2

5

这与编译器确定 lambda 类型的方式有关。当您返回一个 plainnull时,编译器唯一可以暗示的是您正在返回一个对象。因此,您的无参数 lambda 与Task<object>. 但是,您的函数的签名表明您正在返回Task<Guid?>,因此编译器从您的代码中暗示的返回类型不兼容。当您将其null转换为 时Guid?,您向编译器 a 提供了使 lambda a 缺失的线索Task<Guid?>

于 2012-07-01T19:22:10.463 回答
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;
于 2012-07-01T21:08:07.003 回答