C# 类和方法级泛型类型约束交互

C# 类和方法级泛型类型约束交互,c#,generics,inheritance,C#,Generics,Inheritance,考虑以下类别: public class DerivedClassPool<TBase> where TBase : class { public TBase Get(Type componentType) { // Not important, but you get the idea return Activator.CreateInstance(componentType) as TBase; } public

考虑以下类别:

public class DerivedClassPool<TBase> where TBase : class
{
    public TBase Get(Type componentType)
    {
        // Not important, but you get the idea
        return Activator.CreateInstance(componentType) as TBase;
    }

    public TDerived SomeMethod<TDerived>() where TDerived : TBase
    {
        return Get(typeof(TBase)) as TDerived;
    }
}
TBase
已经被约束为类,而
t派生的
被约束为
TBase
或从中派生出来时,为什么我必须这样做?

更新:这个问题是。谢谢你的提问


当TBase已经被约束为类,而TDerived被约束为TBase或从中派生时,为什么我必须这样做

因为值类型可以从引用类型派生
int
是从引用类型
object
System.ValueType
派生出来的,它实现了许多接口。这不会使
int
成为引用类型

DerivedClassPool
的实例调用
SomeMethod
是完全合法的,因为int是从object派生的

现在,有些情况下你的批评是有道理的。我们可以构造这样一种情况,即两个类型参数以这样一种方式相互关联,即它们在逻辑上只能是引用类型,但其中只有一个被语言归类为“已知为引用类型”


作为对读者的练习:你能找到一个吗?可能有必要仔细阅读本规范第10.1.5节,以获得“已知为参考类型”的精确定义。

因为
t数据库
可以是接口,因此
t派生的
可以是值类型。

请参阅。埃里克把它放在那个里。@Jason,我觉得用“但是”读起来更好。@Joey:很公平。我只是讨厌句子以
开头,但是
,即使现在用连词来开始句子被认为是正确的。我责备我的高中英语老师。他是一个坚持经典英语惯例的人。但是这个句子以“我理解…”开头,但里面有一个代码块。(我使用了一个在线,但中间有一个断线,它看起来不正确)我认为它是一个句子,即“我知道为了防止错误,我需要添加约束类,所以我会得到FoO,但为什么……”。无论如何,这不值得担心,特别是当问题已经得到回答时:是否有可能创建我们自己的从引用类型派生的值类型(在C#)呢?@geogeduckett为什么相关?@OskarKjellin:不相关,我只是好奇而已@乔治达克特:当然。“struct S{}”在那里,完成。这是我创建的一个从引用类型派生的值类型。事实上,它派生自两种引用类型(是的,来自ValueType和object)。在阅读你的部分时,我有一种奇怪的感觉:我发现了相反的情况,显然有一种类型既不是值类型也不是引用类型。从语义上来说,我理解指针两者都不是,但感觉有点奇怪。你确定吗<代码>类型参数必须是引用类型;这也适用于任何类、接口、委托或数组类型。
对此一无所知。在这里,
class
表示“值类型”case@OskarKjellin:“类”是指“任何引用类型”。“struct”表示“任何不可为null的值类型”。@EricLippert-Oops,我输入错误。走错路
where TDerived : class, TBase