Почему метод string (Object object) может не совпадать с Funcтип делегата? - PullRequest
1 голос
/ 17 октября 2019

Я пишу простую консольную систему меню как часть проекта курса на C #, где каждый пункт меню состоит из строки, соответствующей вводу пользователя, и команды для выполнения.

public class MenuItem
    {
        private string _description;

        public string Description
        {
            get => _description;
            set => _description = Validate(value, 1, 100, false);
        }

        public Func<string> CommandToExecute { get; set; } // works

        public Func<Game, string> SaveCommand { get; set; } // refuses to work

    }

Я попытался использовать Func<string> для шаблонирования статических строковых методов, и это сработало отлично. Однако теперь мне нужен еще один Func для сопоставления с методом, принимающим объект Game в качестве входного параметра и возвращающим строку.

К сожалению, когда я попытался использовать Func<Game, string> SaveCommand для сопоставления с моим методом static string SaveGame(Game game), программапометил это как ошибку.

static string SaveGame(Game game)
        {
            var gameName = Console.ReadLine();

            ...
            return gameName;
        }

Я вызываю этот метод следующим образом:

static string GameRun()
        {
            var game = new Game(_settings);

            var gameInnerMenu = new Menu(0)
                {
                    MenuTitle = "Choose one of the following actions:",
                    MenuItemsDictionary = new Dictionary<string, MenuItem>()
                    {
                        {
                            "S", new MenuItem()
                            {
                                Description = "Save the current game",
                                CommandToExecute = SaveGame(game)
                            }
                        }
                    }
                };

Этот код дает мне ошибку Cannot convert source type 'string' to target type 'System.Func<GameEngine.Game, string>'.

Яочень плохо знаком с C # и ООП в целом, поэтому я был бы признателен за любые предложения о том, что может быть причиной и как это можно исправить.

1 Ответ

3 голосов
/ 17 октября 2019

Проблема в том, что вы не назначаете метод SaveGame свойству CommandToExecute. Используя CommandToExecute = SaveGame(game), вы вместо этого выполняете метод SaveGame и присваиваете возвращаемое значение CommandToExecute.

. Что вам нужно сделать, это

{
    ...
    CommandToExecute = SaveGame
}

Если вы хотитечтобы найти его, этот синтаксис называется преобразованием группы методов, и это ярлык для записи CommandToExecute = new Func<Game, string>(SaveGame).

...