我可以使用标准委托而不是谓词吗?

Can I use a standard delegate instead a predicate?

我知道我可以使用匿名方法或 lambda 表达式,例如:

myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10); });


myObjects.RemoveAll(m => m.X >= 10));

但我不知道是否可以使用常规委托 (delegate bool X (MyObject o) ),我的尝试失败了。

即创建委托,将其设置为方法 a,然后将委托实例作为谓词传递。

出于兼容性原因,您必须显式实例化委托,即使不同委托的签名是兼容的。这没有很好的记录,请参阅 this question.

中的讨论

(非常冗长的)语法示例:

public void Test()
{
    var l = new List<MyObject>();
    // The following three lines
    var x = new X(my => string.IsNullOrEmpty(my.Name));
    var p = new Predicate<MyObject>(x);
    l.RemoveAll(p);
    // ...will accomplish the same as:
    l.RemoveAll(my => string.IsNullOrEmpty(my.Name));
}

private delegate bool X(MyObject m);

private class MyObject
{
    public string Name { get; set; }
}