Хранение различных действий в очереди (требуется уточнение) - PullRequest
0 голосов
/ 28 сентября 2018

TLDR;Почему это работает.

    Queue<Action> queue = new Queue<Action>();
    queue.Enqueue(() => Load("Scene01"));

Но не это.

    Queue<Action> queue = new Queue<Action>();
    queue.Enqueue(Load("Scene01"));

Я пытался создать простую систему загрузки, которая позволяла бы планировать несколько нагрузок.в то же время.Выяснилось, что было бы просто сохранить запрос как действие, которое затем добавляется в очередь, через которую проходит какая-то функция.

Используемая мной функция загрузки перегружена, и, следовательно, созданные действия будут отличаться друг от друга.Сначала я думал, что мне нужно будет создать какую-то общую систему, которая могла бы выполнять различные действия, но потом я нашел это.

Сохранение списка методов в C #

Вопрос Почему вы можете передать функцию, которая не соответствует действию, используя лямбда-выражение?

Queue<Action> queue = new Queue<Action>();

private void Load() { }

private void Load(string n) { }

private void QueueLoad()
{
    // This match action signature.
    queue.Enqueue(Load);

    // This does not match, nor work.
    queue.Enqueue(Load("Scene01"));

    // Adding lambda expression and it works. Why?
    queue.Enqueue(() => Load("Scene01"));
}

1 Ответ

0 голосов
/ 28 сентября 2018
queue.Enqueue(Load);

Это работает, потому что Load является группой методов и может быть преобразовано в Action.

queue.Enqueue(() => Load("Scene01"));

Это работает, потому что лямбда-выражение не принимает аргументов иничего не возвращает, следовательно, неявно преобразуется в Action.

queue.Enqueue(Load("Scene01"));

Это не работает, потому что Load("Scene01") является вызовом метода, а метод ничего не возвращает, вы пытаетесь передать voidв Enqueue метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...