背景
[如果您对背景不感兴趣,请跳至问题]
我在前几天阅读时偶然发现了这个通用的类定义,并且让我困扰了一段时间:
public abstract class Entity<T> where T : Entity<T>
我对T
Entity<T>
Entity<T>
本身abstract
的类型感到困惑。这似乎是一种奇怪的递归约束。
然后我意识到这个约束可以通过子类化来满足(当然,这是public class Deriver : Entity<Deriver>
对类的要求):
T
此处,Entity<T>
类型保证属于Deriver
类型,因为Entity<Deriver>
来自class Entity<T> where T : Entity<T>
。
问题
无论如何,这让我想知道,如果课程不是抽象的,我们可以直接进行即时表达吗?
所以给出
Entity<T>
我们可以直接点Entity<SomeClass> e = new Entity<SomeClass>();
吗?
显然我们不能说:
SomeClass
因为where T : Entity<T>
不满足约束abstract
。
忽略明显的“你为什么要那样做?”这本质上是一种确保在不使用{{1}}关键字的情况下使用它之前对类进行修改的方法吗?
答案 0 :(得分:2)
这个假设是不正确的。以下将编译:
var e = new Entity<Deriver>();