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

标签 c# delegates type-conversion func method-call

我正在编写一个简单的基于控制台的菜单系统,作为 C# 类(class)项目的一部分,其中菜单的每个项目都包含一个匹配用户输入的字符串和一个要执行的命令。

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 的方法属性(property)。通过使用 CommandToExecute = SaveGame(game)您正在执行 SaveGame方法并将返回值赋给CommandToExecute .

你应该做的是

{
    ...
    CommandToExecute = SaveGame
}

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

关于c# - 为什么 string Method(Object object) 可能与 Func<Object, string> 委托(delegate)类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58432699/

相关文章:

c# - ADO 数据服务的预测

c# - 防止 "Edit"用户控件上的 CSS 更改?

C# 生成的 SOAP 客户端自定义转换器

c++ - C 和 C++ 类型转换的区别?

c# - Datagridview:如何从列表中获取 "typeconvert"属性

java - 将 long 编码为 int,反之亦然

c# 正则表达式匹配排除第一个和最后一个字符

c# - 行动 lambda 中的逆变 - C#

c# 是否可以创建这样的委托(delegate)?

ios - 理解 iOS 编程中的委托(delegate)