Как избежать безделья при реализации общей структуры данных в C#

#c# #generics

#c# #общие

Вопрос:

Предположим, что у меня есть структура данных (скажем, стек), которая использует массив для хранения элементов.

Что-то вроде этого

 class Stack<T>
{
    private T[] _items;
    int Size {get; set; }
    // irrelevant code
    
    T pop()
    {
         // Some condition checking
         --Size;
         T result = _items[Size];
         _items[Size] = null;         // Needed if T is a reference type and we want to reclaim the                    
                                      // memory, however will not 
                                      // compile, since T is not necessarily a reference type
        
         return resu<
     }
     // Irrelevant
 }
  

Мой вопрос, можно ли сделать _items[Size] = null условным, в зависимости от типа T. Если да, то как это делается?

Комментарии:

1. я думаю, вы хотите, чтобы это было причиной того, что вы не можете применять null к структурам, и у вас нет общего ограничения на T, в этом случае я бы попытался установить его на default

2. может быть _items[Size] = default

Ответ №1:

 _items[Size] = default(T);
  

Должно работать для всех типов, будь то ссылочные или типы значений.

Комментарии:

1. Вы можете использовать C # 7.1 default . Сохраните себе 3 символа!

2. Это правда, но я не знаю, использует ли OP 7.1 или выше.

3. Мне было интересно, возможно ли это сделать, если я хочу, чтобы мой код был безопасным для null. если T является ссылкой, то _items[Size] = default будет равно null . Если я рассматриваю предупреждения как ошибки и CS8601, то код не будет компилироваться. Что можно было бы обойти в этом случае?