为什么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的限制

为什么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应该是参数列表的元素还是参数列表?