如何将委托作为C#中的默认参数

时间:2014-04-12 21:51:34

标签: c# delegates

我正在为个人项目构建基于文本的菜单系统。该菜单上的选项将包含文本和操作(方法调用)。所以我觉得使用代表是有道理的。

所以我尝试使用Delegate作为addOption()的可选参数,我收到了错误

  

错误' optionAction'的默认参数值必须是编译时常量

所以我不确定如何解决这个问题。我的意思是它说它必须是编译时常量。我没有逻辑地看到我的方法defaultod()在编译时发生任何变化的可能性,但是Visual Studio这样做了,如果可能的话我需要一个解决方法。

这是我的代码示例。我很乐意根据要求展示更多。

private delegate void defaultOption();
private void defaultOptionCall() { }

public void addOption(string optiontext,
                      Delegate optionAction = new defaultOption(defaultOptionCall))
{

}

3 个答案:

答案 0 :(得分:3)

如果在表达式中使用new关键字,则显然不是常量表达式。 (正如Eric Lippert在他的评论中所说,将intnew 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!") });