我正在为个人项目构建基于文本的菜单系统。该菜单上的选项将包含文本和操作(方法调用)。所以我觉得使用代表是有道理的。
所以我尝试使用Delegate作为addOption()的可选参数,我收到了错误
错误' optionAction'的默认参数值必须是编译时常量
所以我不确定如何解决这个问题。我的意思是它说它必须是编译时常量。我没有逻辑地看到我的方法defaultod()在编译时发生任何变化的可能性,但是Visual Studio这样做了,如果可能的话我需要一个解决方法。
这是我的代码示例。我很乐意根据要求展示更多。
private delegate void defaultOption();
private void defaultOptionCall() { }
public void addOption(string optiontext,
Delegate optionAction = new defaultOption(defaultOptionCall))
{
}
答案 0 :(得分:3)
如果在表达式中使用new
关键字,则显然不是常量表达式。 (正如Eric Lippert在他的评论中所说,将int
和new int()
等基本值类型指定为常量表达式。不是很直观。)。代表不被视为编译时常量。唯一的选择是使用null
。
public delegate void DefaultOption();
private void DefaultOptionCall() { }
public void AddOption(string optiontext, DefaultOption optionAction = null)
{
DefaultOption action = optionAction ?? DefaultOptionCall;
...
}
如果第一个术语是??
,那么合并运算符null
会生成第二个术语,否则会产生第一个术语。
而且,由于DefaultOption
用于声明公共方法,因此它也必须是公共的。并且可选参数不能通过引用。
最后,.NET命名约定说方法名称和类型名称(如委托类型)应以大写字母开头。标准类型的C#别名是此规则的一个例外。
答案 1 :(得分:2)
您应该使用方法重载:
AddOption(String)
=>这将执行整个默认操作,并且不需要委托,因为您事先知道需要什么。AddOption(String, Delegate)
无论如何,为什么不使用Action
代替Delegate
?
另一方面,如果ref
是的引用类型,您希望使用Delegate
关键字?我相信你的情况没用。
答案 2 :(得分:1)
我强烈建议使用Action
,因为它的想法相同但语法和实现更简单......
public void addOption(string optiontext, Action optionAction = null)
{
if (optionAction == null)
{
defaultOptionCall();
// whatever else you need
return;
}
// to run the action
optionAction.Invoke();
}
这允许您传递一个字符串和您选择的方法并将其执行,除非它为空而不会与ref
混淆。虽然技术上Action
本身就是一种已经暗示的授权形式。示例用例...
addOption("default");
addOption("hello", () => { Console.WriteLine("Hello!") });