C#异步迭代器报错CS0029:无法返回值的问题咨询
问题解决:CS0029 无法将List隐式转换为AWSLambda
错误原因
你的ListOfLambdas方法声明返回IAsyncEnumerable<AWSLambda>,要求每次yield return输出单个AWSLambda实例,但你直接返回了整个List<AWSLambda>集合,类型不匹配导致编译器报错。
解决方案
以下两种实现方式都能满足你获取可迭代列表的需求:
方式1:直接逐个返回转换后的元素(推荐)
无需先将所有元素存入List,直接遍历response.Functions,转换后逐个yield return,避免额外的List内存开销:
public void FunctionHandler() { IAsyncEnumerable<AWSLambda> returnedListOfLambdas = ListOfLambdas(); } private async IAsyncEnumerable<AWSLambda> ListOfLambdas() { var lambdaClient = new AmazonLambdaClient(); var response = await lambdaClient.ListFunctionsAsync(); foreach (var function in response.Functions) { yield return MapLambda(function); } } private static AWSLambda MapLambda(FunctionConfiguration function) { return new AWSLambda { FunctionName = function.FunctionName.ToString(), FunctionARN = function.FunctionArn.ToString(), FunctionDescription = function.FunctionName.ToString(), FunctionRunTime = function.Runtime.ToString(), FunctionMemorySize = function.MemorySize.ToString(), FunctionTimeout = function.Timeout.ToString(), FunctionHandler = function.Handler.ToString() }; }
方式2:先收集到List再逐个返回
如果业务需要先将元素存入List再返回,遍历List逐个输出即可:
private async IAsyncEnumerable<AWSLambda> ListOfLambdas() { var lambdaClient = new AmazonLambdaClient(); var list = new List<AWSLambda>(); var response = await lambdaClient.ListFunctionsAsync(); foreach (var function in response.Functions) { list.Add(MapLambda(function)); } foreach (var lambda in list) { yield return lambda; } }
补充说明
使用IAsyncEnumerable时,消费它需要用await foreach循环,需将FunctionHandler改为异步方法:
public async Task FunctionHandler() { await foreach (var lambda in ListOfLambdas()) { // 处理每个lambda实例 } }
内容的提问来源于stack exchange,提问作者Stephen Smith
相关产品推荐
相关产品推荐

