声明之间有什么区别:
GenericClass<T> genericInst = new GenericClass<T>();
和
GenericClass<baseClass> temp = new GenericClass<baseClass>();
这里GenericClass被定义为where T : baseClass
GenericClass包含通用列表
private List<T> vals = new List<T>();
答案 0 :(得分:1)
在我看来,请纠正我,如果我错了,你正在把'哪里T:baseClass'好像是T
类型的默认值为baseClass
?
如果是这样,情况就不是这样,专业化where T : baseClass
意味着类型T
必须是baseClass
或来自baseClass
(或者如果它是接口而不是类)。
因此,如果你有:
public class GenericClass<T> where T : baseClass
{
}
然后你可以说:
var x = new GenericClass<baseClass>();
或者
var y = new GenericClass<SomethignDerivedFromBaseClass>();
但你不能说:
var z = new GenericClass<int>();
由于int
未从baseClass
继承。
在上面的实例化中实际使用T
的唯一方法是,如果您实际上是在GenericClass<T>
内调用该行代码:
public GenericClass<T> where T : baseClass
{
void SomeMethod()
{
GenericClass<T> genericInst = new GenericClass<T>();
}
}
或者从已知T已知为baseClass的子类的另一个上下文。
<强>更新强>
根据您的评论,听起来您会想知道如果您有:
public class GenericClass<T> where T : baseClass
{
public List<T> Items { get; set; }
...
}
是否可以将从baseClass派生的内容添加到列表中,答案是yes-ish。可以为从baseClass继承的任何GenericClass<T>
声明类T
。但List<T>
仍然会被强类型化以输入T
。
给出了这些:
public class BaseClass { }
public class SubClass : BaseClass { }
GenericClass<BaseClass>
BaseClass
可以同时包含SubClass
和List<T>
,因为T
将是BaseClass
。
但GenericClass<SubClass>
将List<T>
T
SubClass
SubClass
,因此只能保留{{1}}项或从中继承的项目。