Saya mencari di StackOverflow, tidak menemukan artikel atau apapun yang berhubungan dengan itu.

Misalnya, contoh berikut menjelaskan array ValueTuple

(string CategoryName, params string[] Properties)[]  MyArrayValueTupleParameter  // Compile-Time Syntax error

Perhatikan bahwa contoh sebelumnya digunakan sebagai parameter. bukan variabel.

Tetapi hanya string[] yang berfungsi tanpa params? Apakah saya melewatkan sesuatu di sini atau tidak didukung secara default?

Sekilas:

Ini bekerja

void ShowAppearanceCategories((string CategoryName, string[] Properties)[] VisibleCategories)
{
    foreach (var Row in PropertyGridControl.Rows)
    {
        var VisibleCategory = VisibleCategories.FirstOrDefault(x => x.CategoryName == Row.Name);
        if (VisibleCategory != default)
        {
            foreach (var ChildRow in Row.ChildRows)
            {
                if (VisibleCategory.Properties.Any(x => ChildRow.Name.Contains(x)))
                {
                    ChildRow.Visible = false;
                }
            }
        }
        else
        {
            Row.Visible = false;
        }
    }
}

Ini Tidak Bekerja

void ShowAppearanceCategories((string CategoryName, params string[] Properties)[] VisibleCategories) // Syntax-Error
{
    foreach (var Row in PropertyGridControl.Rows)
    {
        var VisibleCategory = VisibleCategories.FirstOrDefault(x => x.CategoryName == Row.Name);
        if (VisibleCategory != default)
        {
            foreach (var ChildRow in Row.ChildRows)
            {
                if (VisibleCategory.Properties.Any(x => ChildRow.Name.Contains(x)))
                {
                    ChildRow.Visible = false;
                }
            }
        }
        else
        {
            Row.Visible = false;
        }
    }
}
-1
deveton 22 Desember 2020, 21:45

2 jawaban

Dalam tanda tangan metode, kata kunci params harus didahului dengan awal daftar argumen atau argumen sebelumnya. Itu harus diikuti oleh jenis parameter tambahan.

Begitu:

ReturnType MethodName(/* arguments */, params Type[] containingArrayName) { /* method body */ }

Di tanda tangan Anda, Anda dapat melihat bahwa params tidak berada di awal deklarasi parameter: void ShowAppearanceCategories((string CategoryName, params string[] Properties)[] VisibleCategories)

Tanda kurung tambahan (string CategoryName, params string[] Properties) di sini membuatnya lebih dekat ke tipe tupel, di dalamnya kata kunci params tidak diizinkan menyebabkan kesalahan sintaksis.

Saya tidak yakin apa yang Anda cari tetapi sepertinya ini:

void ShowAppearanceCategories(params (string CategoryName, string[] Properties)[] VisibleCategories)
2
ekke 22 Desember 2020, 19:11

Jawabannya ada di depan Anda...

Kata kunci params, dijelaskan dengan sangat baik oleh jawaban lain di sini, mengaktifkan metode untuk menerima larik objek (dalam kasus Anda string[]). Apakah pemanggil metode Anda melewati 1 string atau 100 string, metode Anda akan mendapatkan array string. Ini hanyalah gula sintaksis untuk membuat hidup kita sebagai pengembang lebih mudah.

Namun tuple Anda telah larik string:

(string CategoryName, string[] Properties)

Anda tidak membutuhkan kata kunci params, karena Anda sudah memiliki struktur yang Anda butuhkan: string[].

Atau mungkin ini akan menjelaskannya dengan lebih baik: kedua metode ini sama:

void DoSomething(string[] Properties) {...}

void DoSomething(params string Properties) {...}

Dengan kedua tanda tangan metode ini, Anda akan mereferensikan argumen Properties sebagai string[].

Tolong beri tahu saya jika saya tidak jelas.

1
Shai Cohen 3 Januari 2021, 05:53