gpt4 book ai didi

c# - 泛型声明和提供类参数的区别

转载 作者:太空宇宙 更新时间:2023-11-03 14:04:33 26 4
gpt4 key购买 nike

声明之间有什么区别:

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 (如果它是接口(interface)而不是类,则实现)。

因此,如果你有:

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 派生的东西添加到列表中,答案是肯定的。类(class)GenericClass<T>可以为任何 T 声明继承自baseClass。但是 List<T>仍然会被强类型化为类型 T .

给出这些:

public class BaseClass { }
public class SubClass : BaseClass { }

A GenericClass<BaseClass>可以同时容纳 BaseClassSubClass在里面 List<T>T将是 BaseClass .

但是一个GenericClass<SubClass>会有一个 List<T>其中 T将是 SubClass因此只能容纳 SubClass 的项目或继承自它。

关于c# - 泛型声明和提供类参数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9773993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com