Вы должны изменить тип BaseObjectCollection
, чтобы он был универсальным в типе значения, которое он будет использовать. Например:
public class BaseObjectCollection<T> : Dictionary<ulong, T>
where T : BaseObject
Тогда вы можете использовать BaseObjectCollection<Task>
и при этом быть полностью безопасным для типов.
(я бы лично использовал композицию в большинстве случаев, а не выводил новый тип из Dictionary<,>
, но это другой вопрос.)