为什么params不接受泛型类型
本文关键字:泛型类型 不接受 params 为什么 | 更新日期: 2023-09-27 18:09:11
这是我的场景,
A函数:
public String StringConcat(params String[] parameter)
{
String l_strReturnValue = String.Empty;
for (Int32 l_nIndex = 0; l_nIndex < parameter.Length; l_nIndex++)
{
l_strReturnValue += parameter[l_nIndex];
}
return l_strReturnValue;
}
我把它命名为
List<String> l_lstTest = new List<string> { "A", "B", "C" };
String l_strString = StringConcat(l_lstTest.Select(X => X).ToArray());
它返回值为"ABC"
但是如果我调用没有类型转换的函数会显示错误,比如
String l_strString = StringConcat(l_lstTest.Select(X => X));
那么如何使用没有转换的函数呢?
注1:
在XDocument Add
方法-他们使用像params
,但没有这样的类型转换的需要。
注释2:
这篇文章的目的不是添加字符串,只是想了解更多关于params
的限制
Select(X => X)
的返回类型将是IEnumerable<string>
-而不是数组。所以你需要另一个重载:
public String StringConcat(IEnumerable<string> parameter)
你可能会让数组重载调用this重载。
(是的,显然您希望使用StringBuilder
而不是重复的字符串连接-并且使用foreach
而不是for
循环。)
请注意,相关的XDocument.Add
重载接受params Object[]
参数,而不是params String[]
—并且LINQ to XML的工作原理是,如果您试图添加本身可枚举的内容,则好像您依次添加了每个项。这不是语言的一部分,而是实现的一部分。所以如果你调用:
doc.Add(someStringArray.Select(x => x))
将会调用XDocument.Add(object)
这将会注意这个参数实现了IEnumerable
params
关键字的限制是参数必须是数组类型
l_lstTest.Select(X => X)
是IEnumerable<string>
,而不是数组,因此它不匹配形式参数类型。如果你试图传递一个普通的int
,它也会不起作用。
要使它工作,你应该添加另一个方法的重载:
public String StringConcat(IEnumerable<string> parameter)
{
// your code here
}
这是设计对参数的限制,因为如果您使用
public String StringConcat(params object[] parameter)
调用IEnumerable时,你无法确定参数是单个参数还是应该在enumerable上迭代。例如,如果没有这个限制,在
中 StringConcat( l_lstTest.Select(X => X) )
IEnumerable应该是参数列表的元素还是参数列表?