C# 作为函数中的可选参数的操作

C# 作为函数中的可选参数的操作,c#,action,optional-parameters,C#,Action,Optional Parameters,是否可以将操作作为函数中的可选参数?按钮2操作应该是可选的 public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse", Action p_Button2Action) { // Stuff happens here } 我用例如p_Button2Action=delegate{Debug.Log(“NotInUse”)}尝试了它,但它没有编译,因为p_Button2Action的默认参数值

是否可以将操作作为函数中的可选参数?按钮2操作应该是可选的

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse", Action p_Button2Action)
{
 // Stuff happens here
}
我用例如
p_Button2Action=delegate{Debug.Log(“NotInUse”)}
尝试了它,但它没有编译,因为p_Button2Action的默认参数值必须是编译时常量。如何使可选操作成为编译时常量?

尝试以下操作:

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse", Action p_Button2Action = null)
{
 // Stuff happens here
}

一种解决方法可能是只使用经典重载:

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse")
{
    DrawWindow(p_PositionAndSize, delegate{ Thread.Sleep(1); }, p_Button2Text);
}

public void DrawWindow(Rect p_PositionAndSize, Action p_Button2Action, string p_Button2Text = "NotInUse")
{
 // Stuff happens here
}

通过这种方式,您可以使用两个参数指定重载中的默认操作。

您必须为默认参数指定一个常量值,因此您可以为操作指定的唯一默认值为null

但是,很容易检查null并替换正确的值:

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse", Action p_Button2Action = null)
{
    if (p_Button2Action == null)
        p_Button2Action = delegate{ Debug.Log("NotInUse"); }

    ...
}

但OP希望在那个里有一个默认的操作,比如delegate{Debug.Log(“NotInUse”);},而不是null,那个么我认为你们应该接受Mario的建议。根据语言规范,除了null之外,不能使用默认值来引用类型。默认参数中只允许字符串有值。如果希望将null作为默认操作,可以使用:p_Button2Action?.Invoke()@RMazitov注意到空合并运算符仅在C#6或更高版本中可用-因此现在使用它是正确的(但显然它在2013年不存在)是的,这一点很好。谢谢你提出来)