如果我有一个功能
void Foo(params int[] bar){}
以下运行良好:
int[] a1 = {1, 2, 3};
int[] a2 = {4, 5, 6};
Foo(1, 2, 3);
Foo(a1);
但这些会导致编译错误:
Foo(a1, 1, 2, 3);
Foo(1, 2, a1);
Foo(1, a1, 2);
Foo(a1, a2, 1, 2, 3);
因为只允许第一个参数为int [],其余的必须是int。
最后一个例子是我想要做的,但语言不会让我没有先组合数组。我非常喜欢语法的简单性,我宁愿不再添加代码。有没有人有一个很好的方法来做到这一点?
答案 0 :(得分:11)
这很奇怪。 Foo(a1, 2, 3)
不应该有用。你应该传递一个数组或一堆整数。你不能混合它们AFAIK。你还有其他超载吗?
这样做并没有真正的语法。我能想到的最简洁的是:
Foo(a1.Concat(a2).Concat(new[] {1,2,3}).ToArray());
答案 1 :(得分:2)
同意,非常奇怪的Foo(a1, 2, 3)
有效。
下面是.Concat的扩展方法,使Mehrdad的语法在眼睛上更容易。
public T[] Concat<T>(this T[] first, params T[] other)
{
T[] output = new T[first.Length+other.Length];
first.CopyTo(output,0);
other.CopyTo(output,first.Length);
return output;
}
可以使用如下:
Foo(a1.Concat(a2).Concat(1,2,3));