泛型声明和提供类参数之间的区别

本文关键字:参数 之间 区别 声明 泛型 | 更新日期: 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'当作类型TbaseClass的默认值?

如果是这样,则情况并非如此,特殊化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或从其继承的项