Я хотел бы предложить, возможно, разработать некоторые из ваших собственных интерфейсов словаря, которые включают в себя интересующую вас функциональность. Среди прочего, я бы предложил иметь некоторые интерфейсы, которые существуют исключительно для чтения интерфейса, и некоторые, которые позволяют читать доступ для записи. Среди прочего, если у вас есть интерфейс только для чтения, методы, которым все равно, является ли конкретный словарь изменяемым или неизменным, смогут использовать IReadableDict (реализуемый как изменяемыми, так и неизменяемыми словарями), в то время как подпрограммы, которые требуют либо словарь должен быть изменяемым или что он будет неизменным, сможет указать это. Кроме того, выделение некоторых других интерфейсов даст максимальные возможности для ковариации и контравариантности. Например, код, ожидающий IReadableDict , может быть полностью доволен Dict , даже если код, который ожидает IReadWriteDict , не сможет принять Dict . Аналогично, код, которому нужно знать только количество словарей, может принимать неуниверсальный ICountable, который предоставляет метод Count, а код, которому нужно только знать, существует ли определенный ключ, может принимать неуниверсальный IQueryExistence (обратите внимание, что можно совершенно законно проверить, содержит ли Dict конкретный экземпляр Dog; ответ будет «нет», но вопрос верен).