Вопрос о методе расширения. Почему мне нужно использовать someObj = someObj.somemethod (); - PullRequest
0 голосов
/ 25 мая 2010

У меня есть простой метод расширения, который я хотел бы использовать для добавления элемента в массив элементов.

public static T[] addElement<T>(this T[] array, T elementToAdd)
{
    var list = new List<T>(array) { elementToAdd };
    return list.ToArray();
}

это работает нормально, но когда я его использую, мне нужно установить массив равным возвращаемому значению. Я вижу, что я возвращаю массив. Я, вероятно, хочу, чтобы этот метод был недействительным, но я бы хотел, чтобы этот элемент был добавлен. У кого-нибудь есть идеи о том, что мне нужно сделать, чтобы заставить эту работу работать так, как я хочу?

Вместо someArray = someArray.addElement(item) я просто хочу сделать someArray.addElement(item), и тогда некоторые Array будут готовы к работе. Что мне здесь не хватает?

Ответы [ 3 ]

8 голосов
/ 25 мая 2010

Встроенные массивы имеют фиксированный размер и поэтому не могут быть изменены таким образом. Если вам нужен массив динамического размера, используйте List<T>.

2 голосов
/ 25 мая 2010

Если бы вы могли использовать ref методы расширения, то это было бы возможно, но не совсем хороший способ сделать что-либо вообще. К счастью, они не поддерживаются.

Если у вас абсолютно должно быть что-то подобное, вы можете использовать статический метод с параметром ref:

public static class ArrayHelp {
    public static void addElement<T>(ref T[] array, T elementToAdd)
    {
        Array.Resize(ref array, array.Length + 1);
        array[array.Length - 1] = elementToAdd;
    }
}

Но это так же безобразно (если не более), чем ваше текущее решение.

1 голос
/ 25 мая 2010

Это невозможно. Единственный способ изменить размер массива - создать новый. Если вам нужно часто добавлять элементы в массив, используйте List, они предназначены для этой цели.

...