为什么 string Method(Object object) 可能不匹配 Func<Object, string> 委托类型?

Why string Method(Object object) may not match Func<Object, string> delegate type?

我正在编写一个简单的基于控制台的菜单系统作为 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# 和 OOP 还很陌生,所以如果有任何关于导致它的原因以及如何修复它的建议,我将不胜感激。

问题是您没有将 SaveGame 方法分配给 CommandToExecute 属性。通过使用 CommandToExecute = SaveGame(game),您将改为执行 SaveGame 方法并将 return 值分配给 CommandToExecute

你应该做的是

{
    ...
    CommandToExecute = SaveGame
}

如果要查的话,这种语法叫做方法组转换,是写CommandToExecute = new Func<Game, string>(SaveGame).

的捷径