请查看以下代码行:
public string[] GetStringList(params object[] values)
{
List<string> _stringList = new List<string>();
foreach (object value in values)
{
_stringList.Add(Convert.ToString(value));
//Do something
}
//Why this invalid?
return _stringList;
//Why do required to convert list collection in array
return _stringList.ToArray();
}
由于List和Array都是集合,那么为什么我需要将List转换为Array?
答案 0 :(得分:6)
由于List和Array都是集合,那么我为什么需要将List转换为Array?
是的,它们都是集合,但您的方法签名确切地指定了它返回的类型的集合,这就是您必须准确返回该集合类型的原因。
您可以使用其中一个集合接口更改方法声明以返回字符串集合:
public IEnumerable<string> GetStringList(params object[] values)
或
public ICollection<string> GetStringList(params object[] values)
它允许您返回List<string>
和string[]
,因为它们都实现了接口。您也可以返回HashSet<string>
甚至Queue<string>
(仅适用于IEnumerable<string>
版本。或者编写您自己的类,实现您感兴趣的界面并在您的方法中返回。
但是只要您使用string[]
声明方法,就必须返回string
个数组的内容,而List<string>
不符合该要求。
OFT建议
您可以将values.Length
作为List<string>
构造函数参数传递得更快一些:
List<string> _stringList = new List<string>(values.Length);
它将使用必要的内存量初始化列表内部存储,并允许您添加所有项目而无需重新分配任何内存。
答案 1 :(得分:4)
直接返回列表无效,因为指定的返回类型是数组
↓
public string[] GetStringList(params object[] values)
如果你想要返回一个列表,它应该是
public List<string> GetStringList(params object[] values)
如果你想让两者都有效,你可以让方法返回一个IEnumerable
(或两个类型实现的另一个接口,如ICollection
),如下所示:
public IEnumerable<string> GetStringList(params object[] values)
答案 2 :(得分:3)
Array
和List
是两个不同的东西,Dictionary
也是一个集合,那么为什么字典和数组是相同的?收藏品种类繁多,彼此不同。如果您不想转换,则应返回list而不是Array。
public List<string> GetStringList(params object[] values)
{
List<string> _stringList = new List<string>();
foreach (object value in values)
{
_stringList.Add(Convert.ToString(value));
//Do something
}
return _stringList;
}
答案 3 :(得分:1)
您的函数会根据需要返回string[]
而不是List<string>
。
public List<string> GetStringList(params object[] values)
{
List<string> _stringList = new List<string>();
foreach (object value in values)
{
_stringList.Add(Convert.ToString(value));
//Do something
}
//Why do required to convert list collection in array
return _stringList;
}
答案 4 :(得分:1)
正如你所提到的,它们都是集合,这意味着,它们都实现了ICollection
,但是像继承一样,最具体的对象是不同的事物,但是某些 相同的特征。例如,假设我们有两类:
class Plant : ILivingOrganism {...}
class Human: ILivingOrganism {...}
他们都实现了ILivingOrganism
界面,他们有一些相同的特征,比如void Grow()
行为,这意味着他们都可以成长,因为他们是生物有机体,但是事情是它们是两个不同的东西,即使它们具有相同的一些特征。现在当我编写一个返回Plant
的方法时,显然你不能指望它返回一个Human
,而是,返回ILivingOrganism
的方法,如{{1}你可以期待任何生物体(更一般的类型),例如ILivingOrganism Clone()
或Human
,技术上实现Plant
的所有内容。