Невозможно вернуть значение из итератора C#

Я пытаюсь вернуть перечисляемое значение с помощью асинхронной функции.

У меня возникла проблема с преобразованием возвращаемого значения типа данных в «основной» метод, поскольку внутри него выполняется асинхронный вызов. Я продолжаю внедрять рекомендованные изменения и то, что читаю в Интернете, но каждый раз, когда я вношу изменения, 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)

Номер ошибки сам по себе бесполезен. Всегда указывайте полное и точное сообщение об ошибке.

Ken White 24.07.2024 01:15

Немного странно возвращать IAsyncEnumerable, когда сам список не асинхронен. Наверное, лучше всего просто сделать private async IEnumerable<AWSLambda> ListOfLambdas(), а потом return response.Functions.Select(MapLambda).ToList();

Charlieface 24.07.2024 01:46

@KenWhite Вы, должно быть, ответили довольно быстро. Если вы просмотрите сообщение, вы заметите, что я отредактировал сообщение, включив в него это.

Steve Smith 24.07.2024 07:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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);
});

Другие вопросы по теме