c# tag - 如何將單個對象[]傳遞給params對象




usage form (7)

我有一個方法,它採用PARAMS對象[],如:

void Foo(params object[] items)
{
    Console.WriteLine(items[0]);
}

當我將兩個對像數組傳遞給此方法時,它工作正常:

Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]

但是,當我傳遞一個單獨的對象[]時,它不會將我的對象[]作為第一個參數,而是將所有元素都像我想要的一樣逐一傳遞給它們:

Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]

如何將單個對象[]作為第一個參數傳遞給params數組?


Answers

解決這個問題的另一種方法(這不是很好的做法,但看起來很美):

static class Helper
{
    public static object AsSingleParam(this object[] arg)
    {
       return (object)arg;
    }
}

用法:

f(new object[] { 1, 2, 3 }.AsSingleParam());

一個簡單的類型轉換將確保編譯器在這種情況下知道你的意思。

Foo((object)new object[]{ (object)"1", (object)"2" }));

由於數組是一個對象的子類型,所以這一切都可以實現。 雖然有點奇怪的解決方案,我會同意。


這是一個涉及LINQ的單線解決方案。

var elements = new String[] { "1", "2", "3" };
Foo(elements.Cast<object>().ToArray())

new[] { (object) 0, (object) null, (object) false }

一種選擇是你可以將它包裝到另一個數組中:

Foo(new object[]{ new object[]{ (object)"1", (object)"2" } });

有點醜,但因為每個項目都是一個數組,所以不能只是將它拋出來讓問題消失...比如如果它是Foo(params object items),那麼你可以這樣做:

Foo((object) new object[]{ (object)"1", (object)"2" });

或者,您可以嘗試定義另一個僅使用單個數組的Foo重載實例:

void Foo(object[] item)
{
    // Somehow don't duplicate Foo(object[]) and
    // Foo(params object[]) without making an infinite
    // recursive call... maybe something like
    // FooImpl(params object[] items) and then this
    // could invoke it via:
    // FooImpl(new object[] { item });
}

您需要將其封裝到另一個對象[]數組中,如下所示:

Foo(new Object[] { new object[]{ (object)"1", (object)"2" }});

indexOf可能,但它是“ECMA-262標準的JavaScript擴展;因此它可能不會出現在標準的其他實現中。”

例:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS Microsoft 沒有提供某種替代方案 ,但是如果您願意,可以在Internet Explorer(以及其他不支持indexOf瀏覽器)中為數組添加類似的功能,如快速Google搜索所示 (例如, )。





c# arrays