Zastanawiam się, dlaczego to nie działa tak, jak tego oczekuję. Czy jest to tylko kwestia „wysyłać znaczy wybierać”, czy też istnieje dobry praktyczny powód, dla którego oczekiwane zachowanie jest problematyczne.

Rozważ tę definicję zmiennej:

int[,] a

I ten podpis funkcji

(int, int) FindIndex(int[,] a)

Biorąc pod uwagę te, spodziewałbym się, że to zadziała:

int index = a[FindIndex(a)];

Ale tak nie jest, daje:

CS0022 Niewłaściwa liczba indeksów wewnątrz []; oczekiwane 2

Specyfikacji nie sprawdzałem, ale jestem pewien, że jest ona zgodna ze specyfikacją, więc nie kwestionuję poprawności implementacji, na pewno jest. Chciałbym się dowiedzieć, czy istnieją jakieś praktyczne powody i/lub względy, dla których nie należy tego popierać?

c#
-1
Andrew Savinykh 24 listopad 2018, 04:18

1 odpowiedź

Najlepsza odpowiedź

Całkowicie bezsensowna klasa, która przyjmuje krotki jako indeksator

public class MyFunkyArray<T> : IEnumerable<T>
{
    public MyFunkyArray() { }

    public MyFunkyArray(T[,] buffer) => Buffer = buffer;

    public T[,] Buffer { get; set; }

    public T this[(int, int) tuple]
    {
        get => Buffer[tuple.Item1, tuple.Item2];
        set => Buffer[tuple.Item1, tuple.Item2] = value;
    }

    public IEnumerator<T> GetEnumerator() => ToEnumerable(Buffer).GetEnumerator();

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

    public IEnumerable<T> ToEnumerable(Array target) => target.Cast<T>();
}

Użycie

var array = new MyFunkyArray<int>(new int[2, 2]);

var tuple = (1, 1);

array[tuple] = 3;

foreach (var val in array)
    Console.WriteLine(val);

Wyjście

0
0
0
3

Uwaga: jest to naprawdę tylko do celów akademickich i ma ograniczoną wartość


Dodatkowe zasoby

Indeksatory (przewodnik programowania w języku C #) Indexers (C # Programming Guide)

Indeksatory umożliwiają indeksowanie wystąpień klasy lub struktury, podobnie jak tablice. Zindeksowaną wartość można ustawić lub pobrać bez jawnego określania typu lub elementu członkowskiego wystąpienia. Indeksatory przypominają właściwości, z wyjątkiem tego, że ich akcesory przyjmują parametry.

1
TheGeneral 24 listopad 2018, 04:40