Перечислите Элемент RemoveLast и верните его с T, обнуляемым - PullRequest
0 голосов
/ 23 февраля 2019

Хотя я не совсем понимаю, почему C # не предоставляет методы сбора, которые удаляют И возвращают элементы в одной команде, я пытаюсь написать свои собственные пользовательские расширения ...

    public static T RemoveLast<T>(this List<T> list)
    {
        if (list.Count > 0)
        {
            var item = list[list.Count - 1];
            list.RemoveAt(list.Count - 1);
            return item;
        }
        return null;
    }

Однако это даетошибка для обратной строки: невозможно преобразовать тип выражения 'null' в тип возврата 'T'.

Но попытка установить для T значение NULL (T?) также невозможно.Как мне изменить это так, чтобы T мог обнуляться?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Возможны разные варианты решения вашей проблемы.Одно единственное решение не может решить вашу проблему

. Давайте обсудим сценарий решения, который соответствует вашему требованию

Сценарий 1: Если вы хотите вернуться последнимэлемент, и если последний элемент отсутствует, то вы хотите вернуть значение по умолчанию этого типа данных, тогда вы можете использовать return default(T);

public static T RemoveLast<T>(this List<T> list)
        {
            if (list.Count > 0)
            {
                var item = list[list.Count - 1];
                list.RemoveAt(list.Count - 1);
                return item;
            }
            return default(T);
        }

Сценарий 2: Если вы хотите сделать эту функциютолько для типа значения, вы можете сделать возвращаемое значение Nullable, как показано ниже

public static Nullable<T> RemoveLast<T>(this List<T> list) where T:struct
        {
            if (list.Count > 0)
            {
                var item = list[list.Count - 1];
                list.RemoveAt(list.Count - 1);
                return (T)item;
            }
            return null;
        }

Здесь указание типа T является структурой необходимо, так как ссылочные типы по умолчанию обнуляются и делают их обнуляемыми, что не имеет никакого смысла для компилятора, так что компилятор не будетразрешить это

0 голосов
/ 23 февраля 2019

NVM, получил:

return default(T);
...