public Int64 Add([NotNull] T item)
        {
            if (item is null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            return(Internal.AddOrUpdate(item, 1, Increment));
        }
        public Boolean TryAdd([NotNull] T item, out Int64 count)
        {
            if (item is null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            try
            {
                count = Internal.AddOrUpdate(item, 1, Increment);
                return(true);
            }
            catch (OverflowException)
            {
                count = default;
                return(false);
            }
        }
        public Boolean Remove([NotNull] T item, out Int64 count)
        {
            if (item is null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            lock (Internal)
            {
                if (!Internal.TryGetValue(item, out count))
                {
                    return(false);
                }

                if (count <= 1)
                {
                    return(Internal.TryRemove(item, out count));
                }

                count = Internal.AddOrUpdate(item, 0, Decrement);
                return(count > 0);
            }
        }