5

我想从 Predicate<IMyInterface> 派生一个类,但它看起来好像 Predicate<> 是密封的。就我而言,我想简单地返回指定函数的反转(!)结果。我还有其他方法可以实现目标。我的问题是 MS 设计者在决定密封 Predicate<> 时可能在想什么?

没有太多考虑,我想出了:(a)简化了他们的测试,只是时间与成本的权衡(b)“不好”可能来自 Predicate<>

你怎么看?

更新:有 n 个谓词在初始化阶段动态添加到谓词列表中。每个都是互斥的(如果添加 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

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

4

3 回答 3

20

Predicate<T>是委托类型。你永远不能从委托中派生。

老实说,无论如何,继承在这里听起来并不合适——只需编写一个返回原始反转的方法即可。就这么简单:

public static Predicate<T> Invert<T>(Predicate<T> original)
{
    return t => !original(t);
}
于 2008-10-18T15:14:39.443 回答
4

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

Predicate<T> p;
Predicate<T> inverted = t => !p(t);
于 2008-10-18T15:14:01.397 回答
2

委托的功能是处理类型安全的方法指针列表。C# 设计人员已决定无需向此功能添加任何内容,也没有理由更改委托的行为。

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

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

于 2008-10-20T08:34:48.160 回答