Saya memiliki metode yang mengambil objek params [] seperti:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Ketika saya melewatkan dua array objek ke metode ini, itu berfungsi dengan baik:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Tapi ketika saya melewatkan satu objek [], itu tidak mengambil objek saya [] sebagai parameter pertama, melainkan mengambil semua elemennya seperti saya ingin meneruskannya satu per satu:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
Bagaimana cara mengirimkan satu objek [] sebagai argumen pertama ke array params?
The
params
parameter pengubah memberikan penelepon sintaks pintas untuk melewati beberapa argumen untuk sebuah metode. Ada dua cara untuk memanggil metode denganparams
parameter:1) Memanggil dengan array tipe parameter, dalam hal ini
params
kata kunci tidak berpengaruh dan array tersebut diteruskan langsung ke metode:2) Atau, memanggil dengan daftar argumen yang diperpanjang, dalam hal ini kompilator akan secara otomatis membungkus daftar argumen dalam larik sementara dan meneruskannya ke metode:
Untuk meneruskan larik objek ke metode dengan
params object[]
parameter " ", Anda dapat:1) Buat array pembungkus secara manual dan teruskan langsung ke metode, seperti yang disebutkan oleh lassevk :
2) Atau, berikan argumen ke
object
, seperti yang disebutkan oleh Adam , dalam hal ini kompilator akan membuat array pembungkus untuk Anda:Akan tetapi, jika tujuan metode ini adalah untuk memproses beberapa larik objek, mungkin lebih mudah untuk mendeklarasikannya dengan
params object[][]
parameter " " eksplisit . Ini akan memungkinkan Anda untuk melewatkan beberapa array sebagai argumen:Sunting: Raymond Chen menjelaskan perilaku ini dan bagaimana kaitannya dengan spesifikasi C # di posting baru .
sumber
Ini adalah solusi satu baris yang melibatkan LINQ.
sumber
Anda perlu merangkumnya ke dalam larik [] objek lain, seperti ini:
sumber
Cara lain untuk mengatasi masalah ini (ini bukan praktik yang baik tetapi terlihat cantik):
Pemakaian:
sumber
Salah satu opsinya adalah Anda dapat menggabungkannya ke dalam array lain:
Agak jelek, tetapi karena setiap item adalah sebuah array, Anda tidak bisa membuangnya begitu saja untuk menghilangkan masalah ... seperti jika itu adalah Foo (item objek params), maka Anda dapat melakukan:
Sebagai alternatif, Anda dapat mencoba menentukan instance Foo lain yang kelebihan beban yang hanya membutuhkan satu larik:
sumber
sumber