我在c中有一个类,它的模板和静态方法类似于

class BClass<T>
{
  public static BClass<T> Create()
  {
    return new BClass<T>();
  }
 }

从中派生一个类并为基类指定一个模板参数
class DClass : BClass<int> { }

当我试图使用static方法创建d的实例时出现问题
class Program
{
  static void Main(string[] args)
  {
    DClass d = DClass.Create();
  }
}

给出编译器错误“无法将类型“test.bclass”隐式转换为“test.dclass”。
添加下面的强制转换会导致运行时强制转换异常。
DClass d = (DClass)DClass.Create();

是否有任何简洁的方法允许静态方法创建派生类的实例?理想情况下,我想要一个c++typedef的等价物,我不想要下面的语法(它确实有效)。
BClass<int> d = DClass.Create();

最佳答案

是的,通过对类型本身进行类型引用,这是可能的。请注意,在.NET世界中,我们谈论的是泛型,而不是模板,它们在工作方式上确实有重要的区别。

class BClass<T, TSelf> where TSelf: BClass<T, TSelf>, new() {
    public static TSelf Create() {
        return new TSelf();
    }
}

class DClass: BClass<int, DClass> {}

class Program {
    static void Main(string[] args) {
        DClass d = DClass.Create();
    }
}

07-24 09:33