为什么params不接受泛型类型?

时间:2011-09-20 10:39:59

标签: c# params

这是我的方案,

功能:

    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的限制。

3 个答案:

答案 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应该是参数列表的一个元素,还是参数列表?