泛型谓词的默认值作为参数

时间:2011-01-26 12:28:23

标签: c# arguments default-value predicate

第一次问我:)

我需要一些方法来使用格式

上的泛型来定义默认谓词
Func<T, bool>

然后将其用作默认参数。像这样:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = (T t) => true)

当我这样做时,我得到了编译错误:

'predicate'的默认参数值必须是编译时常量

是否有一种顺利的方法可以解决这个问题,或者是否应该使谓词函数可以为空并相应地更改我的函数逻辑?

谢谢,

3 个答案:

答案 0 :(得分:26)

方法参数的默认值必须是编译时常量,因为默认值实际上被编译器复制到方法的所有调用站点。

您必须使用重载来执行此操作:

public bool Broadcast(byte command, MemoryStream data, bool async) {
    return Broadcast(command, data, async, t => true);
}

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate) {
    // ...
}

此外,mscorlib中有一个特定的Predicate<T>委托,您可以使用它。它与Func<T, bool>具有相同的签名,但它明确地将其标记为委托,该委托决定是否对T的实例执行操作

答案 1 :(得分:3)

为没有最后一个参数的广播设置重载。

答案 2 :(得分:2)

试试这个:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = default(Func<T, bool>))

但我认为你必须检查谓词!= null。