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




4 Answers

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

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

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

usage form

我有一個方法,它採用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數組?




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

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



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

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 });
}



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

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

用法:

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



Related

c# arrays

Tags

c#   arrays