为什么Predicate<>密封?

时间:2008-10-18 15:11:11

标签: c# predicate

我想从Predicate< IMyInterface>派生一个类,但它看起来好像谓词<>是密封的。在我的情况下,我想简单地返回指定函数的反转(!)结果。我有其他方法来实现这个目标。我的问题是,在决定密封Predicate<>?

时,MS设计师可能会想到什么?

没想到我想出了: (a)简化了他们的测试,只是时间与成本之间的权衡 (b)源自Predicate<>

的“无好处”

您怎么看?

更新:在初始化阶段,有n个谓词动态添加到Predicates列表中。每个都是互斥的(如果添加了Abc,则不会添加NotAbc)。我观察到了一种模式:

bool Happy(IMyInterface I) {...}
bool NotHappy(IMyInterface I) { return !Happy(I); }
bool Hungry(IMyInterface I) {...}
bool NotHungry(IMyInterface I) { return !Hungry(I); }
bool Busy(IMyInterface I) {...}
bool NotBusy(IMyInterface I) { return !Busy(I); }
bool Smart(IMyInterface I) {...}
bool NotSmart(IMyInterface I) {...} //Not simply !Smart

它不是我无法解决问题,我想知道为什么我无法以某种方式解决它。

3 个答案:

答案 0 :(得分:19)

Predicate<T>是委托类型。你永远不能从代表那里派生。

老实说,这听起来并不像继承在这里真正适合 - 只需编写一个返回原始反转的方法。就这么简单:

public static Predicate<T> Invert<T>(Predicate<T> original)
{
    return t => !original(t);
}

答案 1 :(得分:4)

Predicate是一名代表。您不能从委托类型继承。 如果要获取反转值,请使用以下命令:

Predicate<T> p;
Predicate<T> inverted = t => !p(t);

答案 2 :(得分:2)

委托的功能是处理类型安全方法指针的列表。 C#设计者已经决定没有任何东西可以添加到此功能中,并且没有理由将行为更改为委托。

所以,乔恩是对的,继承在这里不合适。

代表可以指向方法列表。我们使用+ =运算符或Delegate.Combine添加到此列表中。如果方法的签名不是void,则返回最后一次调用方法的结果(如果正确调用)。