7

例子:

public void foo(params string[] s) { ... }

我们可以调用这个方法:

a) foo("test", "test2", "test3") // multiple single strings
b) foo(new string[]{"test", "test2", "test3"}) // string array

但是不能使用以下方法调用该方法:

c) foo("test", new string[]{"test", "test2", "test3"})

那么当我有一个字符串和一个字符串数组时,是否必须先将它们放入一个数组中才能调用该方法?或者是否有一个很好的解决方法来告诉方法将字符串数组视为单个字符串?

4

4 回答 4

2

虽然您可以在不使用扩展方法的情况下解决此问题,但我实际上建议使用此扩展方法,因为每当我有一个对象但需要一个仅返回该单个对象的 IEnumerable< T > 时,我发现它非常有用。

扩展方法:

public static class EnumerableYieldExtension
{
    public static IEnumerable<T> Yield<T>(this T item)
    {
        if (item == null)
            yield break;

        yield return item;
    }
}

扩展方法在许多场景中都很有用。在您的情况下,您现在可以这样做:

string[] someArray = new string[] {"test1", "test2", "test3"};
foo(someArray.Concat("test4".Yield()).ToArray());
于 2013-08-02T12:53:54.840 回答
1

我认为您假设它string[] s接受一个字符串参数以及一个字符串数组,但事实并非如此。你可以通过这个来实现。

public static void Test(string[] array, params string[] s)
{

}

(记住params必须是最后一个参数)

然后调用:

Test(new string[]{"test", "test2", "test3"}, "test");

注意数组是如何首先传入的,然后是作为params.

于 2013-08-02T12:49:27.767 回答
0

只需将您的字符串添加到数组中:

var newArray = new string[oldArray.length+1];
newArray[0]=yourString;
oldArray.CopyTo(newArray, 1);

foo(newArray);
于 2013-08-02T12:49:57.497 回答
0

只有方法的最后一个参数可以是参数数组 ( params),因此您不能将多个变量传递给其签名仅接受的方法params

因此,您尝试执行的操作C是不可能的,您必须将该字符串添加到数组中,或者创建一个也首先采用字符串参数的重载。

public void foo(string firstString, params string[] s)
{
} 
于 2013-08-02T12:49:25.513 回答