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

在C#4.0中,是否可以从泛型类型参数派生类?,c#,generics,inheritance,subclass,derived-class,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

我一直在尝试,但我似乎不明白。我想这样做

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());
}
公共抽象类SingletonType:TBaseClass
其中:TBaseClass,new()
其中TBaseClass:class
{
静态齐格尔顿(singleton),;
公营单亲家庭
=>_singleton??(_singleton=new TSingleton());
}
计划是这样使用它,它将有点“包装”围绕基类的单例模式

public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}
public类SingletonFoo:SingletonType{
}
然而,我一直在得到这个

无法从“TBaseClass”派生,因为它是类型参数

嗯。。。我以为类型正是你从中衍生出来的

那么我错过了什么


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

不,这是不可能的。例如,以声明为
密封的
类型为例。您不能从该类继承,并且没有限制为非密封类型的约束,因此尝试通过泛型参数从该类继承是不可能的

即使涉及泛型,每个类型都有一个实的、离散的父类。即使在处理开放泛型类型(例如,
typeof(List)
)时,仍然可以找到父类

如果你想要的是允许的,这不是真的,<代码> Type(SuntLoNoType )不会有父类型,这是不允许的。

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

这个问题是重复的,请看我的答案

关于这一点的更多想法。基本上,简短的回答是,可观的成本不会超过该功能的小好处。如果您不喜欢这个答案,请参阅我的第二个答案:

如果你也不喜欢这个答案,请参见后续问题:


不,这是不可能的,因为假设你有这门课:

类栏{
int-example=0;
}
下面是我们的类型参数类:

类foo:T{
int-example=5;
}

如果我们创建了一个类型为
foo
的变量,那么
example
就会混淆。

你说,“嗯……我以为类型正是你从中派生出来的!”-是的,但请再次阅读消息。它说的是“类型参数”,而不是“类型”。这是一个区别。然而,在使用类型(例如“public static T”)的泛型中,您可以在任何地方使用该“Type参数”,那么使用它的方式与将其用作返回类型有什么不同呢?(到目前为止,@Tejs似乎最具洞察力。)也许值得注意的是,与继承相比,这里的构图将是理想的。@Mohamed Nuur,想详细说明一下吗?(…或者任何人都可以?)不知道你的意思。可能重复的好,这并不能真正解释为什么-编译器可以不允许使用
MyType
,其中
X
是密封类型,而不是完全不允许声明
MyType:t
。当然,答案仍然是“不可能”:,为什么泛型参数必须对允许的所有类型有效;例如,
new()
约束允许您编写
T sample=new T()
,因为否则您的泛型参数可能是
int
,而这是无效的代码。如果没有
nosealed
约束,用sealed继承某个东西将违反C#spec。因为不是所有的案例对类型都有效,并且不存在约束,所以它是无效的。错误消息是编译器不允许这种情况发生=DNo,表面原因是规范说基类型不能是类型参数,句号。您试图提供的深层次原因是规范是以这种方式编写的。你没有对此做出解释。(顺便说一句,
int
确实有一个默认构造函数,因此与所有值类型一样满足
new()
约束。)@MarqueIV:你的评论毫无意义。没有
对象
约束。也许你的意思是
class
,但是你的评论是错误的:你可以有一个
new()
约束而没有
class
约束。它怎么会混淆呢?”Bar'有一个类型参数,而不是基类。它们完全不相关并且在不同的范围内。@MarqueIV No,因为
T
foo
bar
类型。由于
foo
类继承自
T
类(
bar
),因此
示例
可能是
0
5
。很抱歉,这是错误的。它们的范围完全不同。您可以从泛型的实例访问一个示例,而从泛型中通过T定义的任何实例变量访问另一个示例。它们不是同一回事。您似乎不理解继承在C#中是如何工作的
example
bar
中是私有的,因此来自
bar
的派生类可以声明自己的
example
而不会出现问题。即使
example
不是私有的,那么
foo
example
也会被视为
新的
。哦,我明白了,很抱歉打扰您