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

时间:2012-03-19 16:30:44

标签: c# generics

声明之间有什么区别:

GenericClass<T> genericInst = new GenericClass<T>();

GenericClass<baseClass> temp = new GenericClass<baseClass>();

这里GenericClass被定义为where T : baseClass

GenericClass包含通用列表

private List<T> vals = new List<T>();

1 个答案:

答案 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可以同时包含SubClassList<T>,因为T将是BaseClass

GenericClass<SubClass>List<T> T SubClass SubClass,因此只能保留{{1}}项或从中继承的项目。