Я думаю, что проблема заключается в двусмысленном термине «нулевой сейф».
Как правило, для типизированной коллекции вы должны использовать дженерики, а не наследование.
Итак, я предполагаю, что требуется производная коллекция, которая добавляет «нулевые проверки безопасности» (что бы это ни значило в вашем случае) поверх некоторой стандартной универсальной коллекции. За исключением C #, универсальные коллекции не используют виртуальные функции, поэтому они не могут быть расширены (кто бы ни решил сделать это, не закрывая при этом классы, он должен быть навсегда лишен возможности программирования).
Таким образом, вам придется использовать старые неуниверсальные коллекции .NET 1.x, такие как Collection, и переопределить их «проверками безопасности типов» и «проверками безопасности null».
С другой стороны, если вы используете «нулевой сейф» в том смысле, в котором я это сделал бы, то более распространенные коллекции, такие как List<T>
, LinkedList<T>
, Stack<T>
, Queue<T>
, уже «нулевой сейф» в том, что они не аварийно завершают работу и не создают исключение, если вы передаете null
. С другой стороны, Dictionary<TKey,TValue>
небезопасен, так как вызывает аргумент GetHashCode. Вам придется переделать их, чтобы определить, что такое хэш-код null
. HashSet<T>
фактически делает это, определяя 0
как хэш null
. Точно так же для SortedList<TKey,TValue>
и SortedDictionary<TKey,TValue>
вам необходимо определить, где null
находится в порядке сортировки.
Насколько я могу судить, невозможно заставить эти коллекции работать правильно. Отсутствие поддержки null
в этих классах вызвано не сбоем хеширующей функции или компаратора при передаче null
, а обусловлено упреждающими проверками во всех общедоступных API. Они не могут быть исправлены публичным наследованием, и C # (.NET в целом) не разрешает частное наследование. С другой стороны, System.Collections.ObjectModel.KeyedCollection<TKey,TItem>
делает все возможное, чтобы не дать нулевым ключам увидеть базовый словарь. Однако это расширяет Dictionary<TKey,TValue>
, чтобы добавить нулевую безопасность через сдерживание, а не наследование.