自反参数约束:X其中T:X-任何更简单的替代方案?我经常通过向简单接口添加自引用(“自反”)类型参数约束来使它们变得更复杂。例如,我可能会这样做:interfaceICloneable{ICloneableClone();}classSheep:ICloneable{ICloneableClone(){…}}//^^^^^^^^^^Sheepdolly=newSheep().克隆()为绵羊;//^^^^^^^^进入:interfaceICloneablewhereTImpl:ICloneable{TImplClone();}classSheep:ICloneable{SheepClone(){…}}//^^^^^Sheepdolly=newSheep().Clone();主要优点:实现类型(例如Sheep)现在可以引用自身而不是其基类型,从而减少了类型转换的需要(如最后一行代码所示)。虽然这很好,但我也注意到这些类型参数约束不直观,并且在更复杂的场景中变得很难理解。*)问:有没有人知道另一种C#代码模式可以达到相同或类似的效果,但更容易掌握?*)此代码模式可能不直观且难以理解,例如通过以下方式:主要优点:实现类型现在可以引用自身而不是基类型,减少了类型转换的需要虽然通过引用自身看起来像是一种类型约束,但它强制实现类型做同样的事情,但它是实际上不是它的功能。人们使用此模式来尝试表达“此方法的重写必须返回重写类的类型”形式的模式,但它实际上并不是类型系统表达或强制执行的约束。我这里有一个例子:http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx虽然这很好,但我也注意到类型参数约束是不直观,在更复杂的场景中变得很难理解。我尽量避免这种模式。很难说。有谁知道另一种C#代码模式可以达到相同或类似的效果,但更容易掌握?不在C#中,不。如果你对这类事情感兴趣,你可以考虑看看Haskell类型系统;Haskell的“高级类型”可以表示该类型的模式。语句XwhereT:X似乎是递归的,人们可能想知道为什么编译器不会陷入无限循环,推理??“如果T是X,那么X实际上是X...>>”。在推理这个简单的关系时,编译器不会进入死循环。但是,具有逆变的泛型的名义子类型通常是不可靠的。有一些方法可以强制编译器进行无限回归,而C#编译器在开始无限回归之前不会检测到这些并阻止它们。(但是。我希望在Roslyn编译器中添加对此的检测,但我们会看到。)如果您有兴趣,请参阅我关于该主题的文章。您还想阅读该论文的链接。http://blogs.msdn.com/b/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx不幸的是,没有办法完全防止这种情况,没有类型约束的通用ICloneable就足够了。您的约束仅将可能的参数限制为自己实现它的类,并不意味着它们是当前实现它的类。换句话说,如果Cow实现了ICloneable,您仍然可以轻松地让Sheep实现ICloneable。出于两个原因,我会简单地使用ICloneable而没有约束:我严重怀疑您会错误地使用错误的类型参数。接口是代码其他部分的契约,而不是自动驾驶仪上的编码。如果部分代码需要ICloneable并且您传递了执行此操作的Sheep,那么从那时起它似乎完全有效。这就是C#学习教程:自反参数约束:XwhereT:X-任何更简单的替代方案?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
