无法隐式转换类型'System.Collections.Generic.List<>'为'System.Threading.Tasks.Task<>>'

14

我遇到了一个异常。

无法隐式转换类型 'System.Collections.Generic.List<IntegraPay.Domain.SObjects.Industry>''System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<IntegraPay.Domain.SObjects.Industry>>'

以下是我的属性和方法。

  private List<WebFormFieldContent> WebFormFields { get; set; } = 
       new List<WebFormFieldContent>();

  Task<IEnumerable<WebFormFieldContent>> IRegistrationRepository.GetWebFormFields()
        {
            return WebFormFields;
        }

1
你为什么期望这段代码能够运行(以及你想要实现什么目标)? - Alexei Levenkov
1
你为什么要返回一个 Task<>?要么使用异步操作,要么返回一个 IEnumerable<WebFormFieldContent>。我感觉你对异步代码的理解还有点欠缺。 - DavidG
这是我的问题。为什么它不起作用? - maxspan
你目前的示例本质上与 string Foo(){return 42;} 相同,这将导致相同的错误... 很难理解你正在寻找什么确切的知识点。你可能需要阅读有关 async 如何改变方法生成的代码的内容(例如 https://www.simple-talk.com/dotnet/.net-tools/c-async-what-is-it,-and-how-does-it-work/)。 - Alexei Levenkov
2个回答

34

通常情况下,当你在方法声明中缺少async时,就会出现这种错误。

当你将async放在方法签名中时,C#编译器会添加“魔法”来将一个对象转换为返回该对象的Task<T>

然而,在你的情况下,async是不必要的,因为你返回一个已经拥有结果的任务:

return Task.FromResult<IEnumerable<WebFormFieldContent>>(
    WebFormFields
);

只有在方法中使用await和async时才能正常工作。如果我将它们移除,就会出现“无法隐式转换类型'System.Threading.Tasks.Task<System.Collections.Generic.List<WebFormFieldContent>>'为'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<WebFormFieldContent>>'”的错误。 - maxspan
@maxspan 很抱歉我错过了类型不匹配的问题。添加显式类型应该可以解决这个问题。 - Sergey Kalinichenko

5

您的方法返回类型是

Task<IEnumerable<WebFormFieldContent>> 

但实现返回一个
List<WebFormFieldContent>. 

您可以将其更改为

Task<List<WebFormFieldContent>> IRegistrationRepository.GetWebFormFields()
    {
        return Task.FromResult(WebFormFields);
    }

或者将私有变量更改为

IEnumerable<WebFormFieldContent> WebFormFields { get; set; } = 
   new List<WebFormFieldContent>();

类型。

或者您可以添加 async 关键字使其成为同步调用。

async Task<IEnumerable<WebFormFieldContent>> IRegistrationRepository.GetWebFormFields()
    {
        return WebFormFields;
    }

是的,那是另一个选项。 - Stephen Zeng
无法将类型'System.Threading.Tasks.Task<System.Collections.Generic.List<WebFormFieldContent>>'隐式转换为类型'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<WebFormFieldContent>>'。 - maxspan
1
@StephenZeng 在你的编辑后应该会以同样的方式失败 - 你需要显式类型,如 Task.FromResult<IEnumerable<WebFormFieldContent>>(WebFormFields); - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接