English 中文(简体)
弹性类型的参数限制:X<T>,T:X<T>, ‒ 更简单的替代品?
原标题:Reflexive type parameter constraints: X<T> where T : X<T> ‒ any simpler alternatives?

我常常把自我参照(“灵活”)类型的参数限制加起来,使简单的接口变得更加复杂。 例如,我要谈谈:

interface ICloneable
{
    ICloneable Clone();
}

class Sheep : ICloneable
{
    ICloneable Clone() { … }
} //^^^^^^^^^^

Sheep dolly = new Sheep().Clone() as Sheep;
                                //^^^^^^^^

页: 1

interface ICloneable<TImpl> where TImpl : ICloneable<TImpl>
{
    TImpl Clone();
}

class Sheep : ICloneable<Sheep>
{
    Sheep Clone() { … }
} //^^^^^

Sheep dolly = new Sheep().Clone();

主要优势: 一种执行类型(例如<代码>Sheep)现在可以指自己,而不是指其基准类型,从而减少进行类型预测的需要(如最后一行的代码所示)。

虽然这是非常好的,但我也注意到,这些类型的参数制约因素并非直观的,而且有在更为复杂的情景中真正难以理解的趋势。

< Question: 是否有任何人了解另一个C#代码模式,这些模式取得了相同的效果或类似效果,但比较容易掌握?


<><><>>>> 这种守则模式可能不可靠,难以理解,例如:

  • The declaration X<T> where T : X<T> appears to be recursive, and one might wonder why the compiler doesn t get stuck in an infinite loop, reasoning, "If T is an X<T>, then X<T> is really an X<X<…<T>…>>." (But constraints obviously don t get resolved like that.)

  • 对于执行者来说,在<代码>TImpl之外应指明哪类。 (制约最终将考虑到这一点)

  • 由于您在各种通用界面之间增加了更多的类型参数和替代关系,因此,这些内容很快就无法管理。

最佳回答

主要优势: 一种执行类型现在可以指自己,而不是其基类,从而减少进行类型预测的需要。

虽然提及自封/em”的类型限制似乎一样,但这种限制迫使执行类型也这样做,实际上不是这样做的。 人们利用这种模式试图表达形式“这一方法的压倒性必须归还压倒性阶级的类型”,但这种限制实际上不是由此类制度表达或实施的。 我举了一个例子:

https://ericfallert.com/02/02/curer-and-curiouser/

虽然这是很 n的,但我也注意到,这些类型的参数限制不是直观的,而且有在更为复杂的假设情景中真正难以理解的趋势。

Yep. 我试图避免这种模式。 它很难说出理由。

任何人都知道另一人 C# 具有相同效果或类似效果但易于掌握的代码模式?

C#,第2号。 如果你有这种利益的话,你可以考虑研究Haskell的类型系统;Haskell的“较高类型”能够代表这些类型的模式。

声明X<T>其中T : X<T>似乎是可检索的,人们可能想知道,汇编者为什么在限定的休息、推理、“IfTX<T>, 然后是;实际上是X<X<......&t;T>&......>&......>&t;&t&;&t&t&;&t&t&t&t&t;&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t&t;<<>>>。

汇编者在解释这种简单的关系时,从未陷入无限的 lo。 然而,一般类型的非专利性补贴,一般而言是不可调取的。 有一些办法迫使汇编者陷入无限的退步,C#汇编者没有发现这些退步,在踏上定点的旅途之前防止这些退步。 (单位:千美元) 我希望在Roslyn汇编者中为此增加探测,但我们看到。

如果你有此利益,请见我关于这个问题的文章。 你们也希望阅读链接文件。

https://ericfallert.com/2008/05/07/covariance-and-contravariance-part-11-to-infinity-but-not-beyond/"rel=“nofollow noreferer”>https://ericfallert.com/2008/05/07/covariance-and-contravariance-part-11-to-infinity-but-not-beyond/

问题回答

Unfortunately, there isn t a way to fully prevent this, and a generic ICloneable<T> with no type constraints is enough. Your constraint only limits possible parameters to classes which themselves implement it, which doesn t mean they are the ones currently being implemented.

换言之,如果<条码>Cow 执行<条码> 可加利用的编码”;Cow>sheep 执行<条码>;Cow>。

我只想使用<条码> 可加固的;T>,但出于两个原因:

  1. 我严重怀疑你会犯错误使用错误的参数。

  2. 接口意在为法典的其他部分订立 合同,不得用于自动轨道代码。 如果守则的一部分内容预期<条码>可加利用和带;Cow>,并通过<条码>。 可以这样做的Sep从那时起似乎完全有效。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...