C# 继承中的循环泛型类型-为什么它可以工作?

C# 继承中的循环泛型类型-为什么它可以工作?,c#,generics,inheritance,circular-dependency,C#,Generics,Inheritance,Circular Dependency,考虑以下几点: public class EntityBase<TEntity> { public virtual void DoSomethingWhereINeedToKnowAboutTheEntityType() { } } public class PersonEntity : EntityBase<PersonEntity> { public override void DoSomethingWhereINeedToKnowA

考虑以下几点:

public class EntityBase<TEntity>
{
    public virtual void DoSomethingWhereINeedToKnowAboutTheEntityType()
    {
    }
}

public class PersonEntity : EntityBase<PersonEntity>
{
    public override void DoSomethingWhereINeedToKnowAboutTheEntityType()
    {
    }
}
公共类EntityBase
{
公共虚拟无效DoSomethingWhere需要了解EntityType()
{
}
}
公共类PersonEntity:EntityBase
{
public override void doSomethingWhereinedToknowabouttheEntityType()
{
}
}
我将其添加到代码中并运行了它,它工作正常,但我很惊讶我可以继承一个定义基于继承类的类

当我尝试它时,我期望它要么不会编译,要么一旦实际调用就会失败

您可以使用界面执行类似操作:

public interface IEntityBase<TEntity>
{}

public class PersonEntity : IEntityBase<PersonEntity>
{}
公共接口IEntityBase
{}
公共类人员:IEntityBase
{}

实际上,我已经使用该界面将代码从前者切换到了后者,但我仍然很好奇为什么这样做有效。

之所以有效,是因为没有理由不起作用
EntityBase
不继承自
PersonEntity
,它只引用类型。基类知道自己的派生类并不存在技术问题。这也是可行的(即使这个具体的例子不是一个好主意):

我很惊讶我可以继承一个定义基于继承类的类

小心-您继承的是一个类,它的定义涉及任意
类型
,仅此而已。所有这些都是合法的:

class O : EntityBase<object>
class S : EntityBase<String>
class Q : EntityBase<Q>

如果需要这样的东西,任何可以想象的“编译顺序”都不起作用。

一个非常简单的例子是通用接口
IComparable
。通常,您可以这样实现它:

class MyClass : IComparable<MyClass> {/*...*/}
class MyClass:IComparable{/*…*/}
通用模板的这个实现只是说
MyClass
对象可以与其他
MyClass
对象进行比较。正如你所看到的,心智模型没有问题。我可以很好地理解一个类的概念,这个类的对象可以在它们之间进行比较,而不需要知道关于这个类的任何其他信息


这里的要点是模板参数仅由泛型类或接口使用,但它们根本不需要通过继承来关联
IComparable
不继承自
MyClass
。因此没有循环。

请注意,当您在对象上实现IComparable和IEquatable时,您总是这样做。@FishBasketGordo。TY用于编辑-混合我的vb和c#!这是最适合我的答案。我一直在使用泛型,我是一个超级粉丝,但我的头脑一片混乱。(今天是星期五!)
class A : EntityBase<B>
class B : EntityBase<A>
class MyClass : IComparable<MyClass> {/*...*/}