在C#4.0中,是否可以从泛型类型参数派生类?

Mar*_*eIV 24 c# generics inheritance subclass derived-class

我一直在尝试这个,但我似乎无法解决这个问题.我想做这个...

public abstract class SingletonType<TSingleton, TBaseClass> : TBaseClass
    where TSingleton : TBaseClass, new()
    where TBaseClass : class
{
    static TSingleton _singleton;
    public static TSingleton Singleton
        => _singleton ?? (_singleton = new TSingleton());
}
Run Code Online (Sandbox Code Playgroud)

计划是像这样使用它,它可以在基类周围"包裹"单例模式......

public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}
Run Code Online (Sandbox Code Playgroud)

但是,我一直这样做

无法从'TBaseClass'派生,因为它是一个类型参数

嗯...我想类型为你到底是什么的派生!

那我错过了什么?

注意:这当然是一个简单的例子,因为它没有添加任何有用的东西,但是假设SingletonType有许多其他逻辑与问题无关,因此忽略了关注手头的问题.

Eri*_*ert 27

C#中的泛型类型不是C++模板; 请记住,泛型类型必须适用于所有可能的类型参数.模板只需要适用于您实际构建的结构.

这个问题是重复的; 看到我的回答

为什么C#泛型不能像C++模板中那样从泛型类型参数中派生出来?

对此更多的想法.基本上,简短的回答是,相当大的成本并没有超过该功能的小优势.如果你不喜欢这个答案,请看我的第二个答案:

为什么C#泛型不能像C++模板中那样从泛型类型参数中派生出来?

如果您不喜欢该答案,请参阅后续问题:

希望.NET泛型可以继承其中一个泛型参数类型的理由是什么?


Tej*_*ejs 19

不,这是不可能的.例如,采用声明的类型sealed.你不能从该类继承,并且没有约束限制非密封类型,ergo试图通过泛型参数继承它是不可能的.

  • 好吧,这并没有真正解释为什么 - 编译器可能只是不允许使用`MyType <X>`其中`X`是密封类型,而不是完全不允许声明`MyType <T>:T`.但当然答案仍然是"它不可能":) (12认同)
  • 不,肤浅的原因是规范说基类型不能是类型参数,完全停止.您尝试提供的深层原因是为什么规范以这种方式编写.你提供了一个非解释. (3认同)
  • (顺便说一句,作为一个挑剔的人,`int` *确实*有一个默认构造函数,因此满足 `new()` 约束,所有值类型也是如此。) (2认同)