泛型声明和提供类参数之间的区别
本文关键字:参数 之间 区别 声明 泛型 | 更新日期: 2023-09-27 18:28:12
声明:之间有什么区别
GenericClass<T> genericInst = new GenericClass<T>();
和
GenericClass<baseClass> temp = new GenericClass<baseClass>();
这里GenericClass被定义为用于where T : baseClass
GenericClass包含一个通用列表
private List<T> vals = new List<T>();
在我看来,如果我错了,请纠正我,你把'where 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>();
由于CCD_ 8不是从CCD_。
在上面的实例化中实际使用T
的唯一方法是,如果您实际上是从GenericClass<T>
:中调用这行代码
public GenericClass<T> where T : baseClass
{
void SomeMethod()
{
GenericClass<T> genericInst = new GenericClass<T>();
}
}
或者来自另一个上下文,其中T已知是基类的一个子类。
更新
根据你的评论,听起来你想知道如果你有:
public class GenericClass<T> where T : baseClass
{
public List<T> Items { get; set; }
...
}
是否可以将从基类派生的东西添加到列表中,答案是肯定的。可以为从基类继承的任何T
声明类GenericClass<T>
。但是CCD_ 14仍将被强类型化为类型CCD_。
这是给定的:
public class BaseClass { }
public class SubClass : BaseClass { }
CCD_ 16可以在其CCD_ 19中同时保持CCD_ 17和CCD_ 18,因为CCD_ 20将是CCD_ 21。
但是GenericClass<SubClass>
将具有List<T>
,其中T
将是SubClass
,因此只能保存SubClass
或从其继承的项