C# 中的自引用泛型继承

本文关键字:泛型 继承 自引用 | 更新日期: 2023-09-27 18:31:58

我看到一些C#asp.net 源代码

,如下所示:
public class EntityInstanceContext<TEntityType> : EntityInstanceContext
{
    /// <summary>
    /// Initializes a new instance of the <see cref="EntityInstanceContext{TEntityType}"/> class.
    /// </summary>
    public EntityInstanceContext()
        : base()
    {
    }

谁能帮助我理解为什么泛型类型是从非泛型类型子类化的? 以这种方式设计有什么好处?

C# 中的自引用泛型继承

.

NET TypeSystem是一个非常强大的系统。想象一下以下场景。我正在编写一个名为 MyTuple 的类,它是 BCL Tuple类的编码不佳的克隆:

public class MyTuple<T1, T2> {
    public T1 Item1 { get; private set; }
    public T2 Item2 { get; private set; }
    public MyTuple(T1 item1, T2 item2) {
        this.Item1 = item1;
        this.Item2 = item2;
    }
}

然后我意识到我想为这种类型制作一种工厂式的方法这样我就可以成功地挂接到类型推断系统,而不是在我不必这样的时候指定T1T2

new MyTuple<int, string>(123, "test"); // which is also a bit redundant

所以我正在编写我在课堂上谈论的方法,我们称该类为Factory

public class Factory {
    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new MyTuple<T1, T2>(item1, item2);
    }
}

这样,我在写作时更快乐:

var tuple = Factory.Create(123, "test"); // and tuple is inferred to be of <int, string>

现在,如果我将Factory重命名为MyTuple会发生什么:

public class MyTuple {
    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new MyTuple<T1, T2>(item1, item2);
    }
}

简而言之:没什么不好的

简单地说,我现在有 2 种完全不同的类型:

  • MyTuple(非泛型)
  • MyTuple <T1,>

他们没有任何共同点,他们是不同的类型。

我可以说MyTuple<T1, T2>恰好扩展MyTuple吗?好吧,只要MyTuple既不static也不sealed是的,当然

public class MyTuple { ... }
public class MyTuple<T1, T2> : MyTuple { ... }

所以在你的情况下,无非是Mammal延长Animal或...... Tiger扩展Mammal .这不像Mammal of a weirder sort扩展Mammal of a good ol' classical sort.