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

Posted

技术标签:

【中文标题】泛型谓词的默认值作为参数【英文标题】:Default value on generic predicate as argument 【发布时间】:2011-06-15 19:52:21 【问题描述】:

第一次问我问题:)

我需要一些方法来使用格式上的泛型来定义默认谓词

Func<T, bool>

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

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

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

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

是否有一种我缺少的平滑方法,或者是否应该使谓词函数为空并相应地更改我的函数逻辑?

谢谢,

【问题讨论】:

【参考方案1】:

试试这个:

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

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

【讨论】:

在这种情况下我还不如做 public bool Broadcast(byte command, MemoryStream data, bool async, Func predicate = null)【参考方案2】:

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

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

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&lt;T&gt; 委托,您可以使用它来代替。它与Func&lt;T, bool&gt; 的签名相同,但它明确地将其标记为一个委托,该委托决定是否对T 的实例执行操作

【讨论】:

我会用这个来获取关于谓词的额外信息【参考方案3】:

为不接受最后一个参数的广播创建一个重载。

【讨论】:

以上是关于泛型谓词的默认值作为参数的主要内容,如果未能解决你的问题,请参考以下文章

c#中泛型类型的默认值[重复]

在 SwiftUI 中使用泛型作为函数属性的默认值

使用支持对象/结构的泛型时如何返回空值/默认值? [复制]

C#中泛型参数的空值或默认比较

选择全部作为多值参数的默认值

函数的默认值作为函数参数