这是我的方案,
功能:
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
的限制。
答案 0 :(得分:4)
Select(X => X)
的返回类型为IEnumerable<string>
- 不是数组。所以你需要另一个重载:
public String StringConcat(IEnumerable<string> parameter)
你可能会让数组重载调用这个重载。
(是的,显然你想要使用StringBuilder
而不是重复的字符串连接 - 而foreach
而不是for
循环。)
请注意,相关的XDocument.Add
重载需要一个params Object[]
参数,而不是params String[]
- 而LINQ to XML的工作方式是,如果您尝试添加本身可枚举的内容,就好像你依次添加了每个项目。这不是语言的一部分 - 它是实现的一部分。所以如果你打电话:
doc.Add(someStringArray.Select(x => x))
实际上只会调用XDocument.Add(object)
注意参数实现IEnumerable
。
答案 1 :(得分:4)
params
关键字的限制是参数必须是数组类型。
l_lstTest.Select(X => X)
是IEnumerable<string>
,不是数组,因此它与形式参数类型不匹配。如果您尝试传递普通int
要使其正常工作,您应该添加该方法的另一个重载:
public String StringConcat(IEnumerable<string> parameter)
{
// your code here
}
答案 2 :(得分:1)
这是设计的params的限制,因为如果你正在使用
public String StringConcat(params object[] parameter)
并且您使用IEnumerable调用,您无法确定参数是单个参数还是应该迭代枚举。例如,没有这个限制,在
中 StringConcat( l_lstTest.Select(X => X) )
IEnumerable应该是参数列表的一个元素,还是参数列表?