我正在编写一个简单的基于控制台的菜单系统,作为 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/