Я пытаюсь вернуть перечисляемое значение с помощью асинхронной функции.
У меня возникла проблема с преобразованием возвращаемого значения типа данных в «основной» метод, поскольку внутри него выполняется асинхронный вызов. Я продолжаю внедрять рекомендованные изменения и то, что читаю в Интернете, но каждый раз, когда я вношу изменения, Visual Studio не нравится что-то еще, что я сделал, и тогда мне приходится возвращаться.
Ошибка связана с функцией ListOfLambdas. В частности, он находится на линии «доходность». Номер ошибки: [CS0029][1].
Что вы хотите сделать? Я хочу получить список/итерируемое значение, которое я затем могу передать и выполнить другую работу.
public void FunctionHandler()
{
IAsyncEnumerable<AWSLambda> returnedListOfLambdas = ListOfLambdas();
}
private async IAsyncEnumerable<AWSLambda> ListOfLambdas()
{
//Instantiating Client:
var lambdaClient = new AmazonLambdaClient();
//Instantiating New Lambda List:
List<AWSLambda> list = null;
//Getting List
var response = await lambdaClient.ListFunctionsAsync();
response.Functions.ForEach(function =>
{
AWSLambda aWSLambda = MapLambda(function);
if (list == null)
{
list = new List<AWSLambda>();
}
list.Add(aWSLambda);
});
yield return list; //Here is our error.
}
private static AWSLambda MapLambda(FunctionConfiguration function)
{
AWSLambda lambdaToBeAdded = new AWSLambda();
lambdaToBeAdded.FunctionName = function.FunctionName.ToString();
lambdaToBeAdded.FunctionARN = function.FunctionArn.ToString();
lambdaToBeAdded.FunctionDescription = function.FunctionName.ToString();
lambdaToBeAdded.FunctionRunTime = function.Runtime.ToString();
lambdaToBeAdded.FunctionMemorySize = function.MemorySize.ToString();
lambdaToBeAdded.FunctionTimeout = function.Timeout.ToString();
lambdaToBeAdded.FunctionHandler = function.Handler.ToString();
return lambdaToBeAdded;
}
Я получаю следующую ошибку: «Невозможно неявно преобразовать тип System.Collections.Generic.List<saveFileS3.AWSLambda> в saveFileS3.AWSLambda».
Но мне это кажется странным. Я думаю, совершенно очевидно, что переменная list не относится к этому типу данных. Что мне не хватает? [1]: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0029?f1url=%3FappId%3Droslyn%26k%3Dk(CS0029)
Немного странно возвращать IAsyncEnumerable
, когда сам список не асинхронен. Наверное, лучше всего просто сделать private async IEnumerable<AWSLambda> ListOfLambdas()
, а потом return response.Functions.Select(MapLambda).ToList();
@KenWhite Вы, должно быть, ответили довольно быстро. Если вы просмотрите сообщение, вы заметите, что я отредактировал сообщение, включив в него это.
List<AWSLambda> list = null;
— это именно System.Collections.Generic.List<saveFileS3.AWSLambda>
, поэтому компилятор жалуется, когда вы пытаетесь вернуть AWSLambda
.
Вам нужен foreach с вложенным возвратом доходности:
foreach (var lambda in list)
yield return lambda;
В идеале вы бы переписали так:
private async IAsyncEnumerable<AWSLambda> ListOfLambdas()
{
using (var lambdaClient = new AmazonLambdaClient())
{
var response = await lambdaClient.ListFunctionsAsync();
foreach (var function in response.Functions)
{
yield return MapLambda(function);
}
}
}
Обратите внимание, что AmazonLambdaClient
реализует IDisposable
, поэтому его следует удалить, когда вы закончите с ним.
Не возвращайте список. Вам не нужен список. Вместо этого yield return
элементы, которые должны были быть помещены в список, по одному.
response.Functions.ForEach(function =>
{
yield return MapLambda(function);
});
Номер ошибки сам по себе бесполезен. Всегда указывайте полное и точное сообщение об ошибке.