Enum в качестве словарных ключей

Предположим, что

enum SomeEnum { One, Two, Three };

SomeEnum - это перечисление, поэтому он должен наследовать от Enum, поэтому, если я пишу:

Dictionary<Enum, SomeClass> aDictionary = new Dictionary<SomeEnum, SomeClass>();

Компилятор жалуется, что он не может неявно преобразовать SomeEnum в Enum?

Ответ 1

Я считаю, что из-за covariance.

Короче:

aDictionary будет Dictionary<SomeEnum, SomeClass>, но в текущем контексте он известен как Dictionary<Enum, SomeClass>.

Если ваше объявление было разрешено, компилятор должен после этого сделать:

aDictionary.Add(someValueFromAnotherEnumUnrelatedToSomeEnum, aValue);

что явно несовместимо с фактическим типом словаря.

То почему co-дисперсия не разрешена по умолчанию, и вы должны явно включить ее в тех случаях, когда это имеет смысл.

Вывод состоит в том, что вы должны точно указать тип:

Dictionary<SomeEnum, SomeClass> aDictionary = 
    new Dictionary<SomeEnum, SomeClass>();

Ответ 2

Enum в своем объявлении не является классом, который равен SomeEnum. Это должно быть

Dictionary<SomeEnum, SomeClass> aDictionary = new Dictionary<SomeEnum, SomeClass>();