首页 > 解决方案 > 如何创建泛型类的实例,其中类型约束到相同的泛型类

问题描述

假设一个类定义如下,

public class MyGeneric<T> where T : MyGeneric<T>
    {

    }

我们可以创建这个类的对象吗?如果不是,为什么会存在这种情况?我问这个是出于我的好奇心,并且对 C# 没有深入的了解。

标签: c#oopgenerics

解决方案


当您有一个类层次结构时,它很有用,并且您希望能够在基类中编写返回派生类实例的方法(例如this):

public abstract class Base<T> where T : Base<T>
{
    public T WithFoo(int foo)
    {
        // ...
        return (T)this;
    }
}

public class Derived : Base<Derived>
{
    // ...
}

Derived d = new Derived().WithFoo(3);

当然,这并不能阻止某人写作:

public class Other : Base<Derived> { }

...解决这个问题的唯一方法是运行时检查,这可能很难看:

public Base()
{
    Trace.Assert(typeof(T) == this.GetType());
}

其他一些语言有特定的关键字来涵盖这种情况。


推荐阅读