是否存在“where not derived from”的generics类型约束?

我们可以在generics类型参数上指定“派生自”约束,如下所示:

class Bar where T : IFooGenerator 

有没有办法指定NOT派生自?


我的用例:我有一堆可并行化的FooGenerator ,每个都有相同的并行化代码,但我们不希望它们始终是并行化的。

 public class FooGenerator : IFooGenerator { public Foo GenerateFoo() { ... } } 

因此,我创建了一个用于并行生成Foo的通用容器类:

 public class ParallelFooGenerator : IFooGenerator where T : IFooGenerator { public Foo GenerateFoo() { //Call T.GenerateFoo() a bunch in parallel } } 

由于我希望FooGeneratorParallelFooGenerator可以互换,因此我制作了ParallelFooGenerator : IFooGenerator 。 但是,我显然不希望ParallelFooGenerator合法。

因此,作为一个辅助问题,如果“不是从”约束条件不可能的话,是否有更好的方法来设计它?

您可以使用以下内容:

 public interface IFooGenerator { Foo GenerateFoo(); } interface ISerialFooGenerator : IFooGenerator { } interface IParallelFooGenerator : IFooGenerator { } public class FooGenerator : ISerialFooGenerator { public Foo GenerateFoo() { //TODO return null; } } public class ParallelFooGenerator : IParallelFooGenerator where T : ISerialFooGenerator, new() { public Foo GenerateFoo() { //TODO return null; } } 

ParallelFooGenerator已经不可能,因为ParallelFooGenerator是generics类型,并且您没有指定generics参数。

例如, ParallelFooGenerator>是可能的 – 并且允许这样的类型真的那么糟糕?

简单回答是不。

答案很长(仍然没有):

微软在对类型约束的解释中说得很好:“编译器必须保证它需要调用的运算符或方法将被客户端代码指定的任何类型参数支持。”

约束的根本目的不是禁止使用某些类型,而是允许编译器知道支持哪些运算符或方法。 但是,您可以检查类型是否在运行时实现/inheritance特定的接口/基类并抛出exception。 但是,通过它,您将无法从智能感知中获得设计时错误。

我希望这有帮助。