C# Func<&燃气轮机;函数的可选参数必须是编译时常量吗?

C# Func<&燃气轮机;函数的可选参数必须是编译时常量吗?,c#,C#,所以我有下面的函数。我希望它有一个标准的参数值,但我不能让它工作,因为它需要一个编译时常量。我知道我可以将它设置为null,但我希望它是一个特定的函数 private void func(Func<List<int>, bool> eval = _ => true) { var b = eval(); } private void func(func eval=\u=>true) { var b=eval(); } 甚至

所以我有下面的函数。我希望它有一个标准的参数值,但我不能让它工作,因为它需要一个编译时常量。我知道我可以将它设置为null,但我希望它是一个特定的函数

    private void func(Func<List<int>, bool> eval = _ => true)
    {
        var b = eval();
    }

private void func(func eval=\u=>true)
{
var b=eval();
}

甚至可以这样做吗?

因为默认参数必须是编译时常量,所以您不能像您所希望的那样提供一个简单的默认函数。不过,正如您所指出的,您可以使用null来解决这个问题

private void func(Func<List<int>, bool> eval = null)
{
    eval = eval ?? (_ => true);
    // Do things.
}
private void func(func eval=null)
{
eval=eval??(=>true);
//做事。
}

如果传递了null,或者调用函数时没有任何参数,这将指定默认实现。

您不能将null以外的任何内容作为默认参数分配给字符串以外的任何引用类型
Func
是一种引用类型

因此,只需在函数中执行默认操作:

private void func(Func<List<int>, bool> eval = null)
{
    if (eval == null)
    {
        //do some default thing
    }
    else 
         eval.Invoke(new List<int>());
}
private void func(func eval=null)
{
如果(eval==null)
{
//做一些默认的事情
}
其他的
eval.Invoke(新列表());
}

对于@JonathonChase的答案,另一种选择是使用重载:

private void func() => func(_ => true);

不,lambdas不能是常量,这只是CLR限制,有关详细信息,请参阅。一种解决方法是将可选参数默认为
null
,只需执行
if(eval==null)eval=…
代码中的第一件事。好的,非常感谢!非常失望,这是不可能的,尽管我喜欢这种方法!谢谢你指出这一点