Estoy tratando de entender el proceso de pensamiento detrás de esta decisión de diseño. También el tipo de retorno de Dictionary.Add es nulo. Sería bueno tener el mismo comportamiento para ambas estructuras de datos. ¿O hay algún caso de uso que haga que la implementación actual sea una mejor opción?
La clase HashSet se basa en el modelo de conjuntos matemáticos y proporciona operaciones de conjunto de alto rendimiento similares al acceso a las claves de las colecciones Dictionary<TKey,TValue> o Hashtable. En términos simples, la clase HashSet se puede considerar como una colección Dictionary<TKey,TValue> sin valores.
Estoy tratando de entender el proceso de pensamiento detrás de esta decisión de diseño.
Solo la persona o personas que realmente tomaron la decisión pueden proporcionar eso. Es poco probable que vean su pregunta aquí, aunque, por supuesto, esa posibilidad no se puede descartar.
¿Hay algún caso de uso que haga que la implementación actual sea una mejor opción?
Hay muchos casos de uso. Pero lo principal a tener en cuenta es que agregar el mismo objeto a un conjunto (como HashSet<T> ) que ya está en el conjunto no es destructivo, mientras que agregar la misma clave a un diccionario (como Dictionary<TKey, TValue> ) es destructivo, es decir, sobrescribe el valor existente.
Hacer que el método Add() devuelva un bool como HashSet<T> no sería útil; para cuando vea el valor false que se ha devuelto, el valor anterior de la clave ya se habrá reemplazado.
Dicho esto, tenga en cuenta que el indexador de diccionarios sobrescribirá el valor existente en silencio. De hecho, los diccionarios tienen exactamente la misma funcionalidad que HashSet<T> , además de la capacidad de evitar que se sobrescriba accidentalmente un valor que ya se almacenó.