是否存在“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 } }
由于我希望FooGenerator
和ParallelFooGenerator
可以互换,因此我制作了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。 但是,通过它,您将无法从智能感知中获得设计时错误。
我希望这有帮助。
上述就是C#学习教程:是否存在“where not derived from”的generics类型约束?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/992458.html