枚举为字典键

sbl*_*din 16 c# .net-2.0

假设有

enum SomeEnum { One, Two, Three };
Run Code Online (Sandbox Code Playgroud)

SomeEnum是一个枚举,所以它应该从Enum继承,所以如果我写:

Dictionary<Enum, SomeClass> aDictionary = new Dictionary<SomeEnum, SomeClass>();
Run Code Online (Sandbox Code Playgroud)

编译器抱怨它不能隐式地将SomeEnum转换为Enum?

Cri*_*scu 21

我相信这是因为协方差.

简而言之:

aDictionary将是一个Dictionary<SomeEnum, SomeClass>,但在目前的背景下,它被称为Dictionary<Enum, SomeClass>.

如果你的声明被允许,编译器应该让你做:

aDictionary.Add(someValueFromAnotherEnumUnrelatedToSomeEnum, aValue);
Run Code Online (Sandbox Code Playgroud)

这显然与字典的实际类型不一致.

这就是默认情况下不允许使用协方差的原因,您必须在有意义的情况下明确启用协方差.

结论是您必须准确指定类型:

Dictionary<SomeEnum, SomeClass> aDictionary = 
    new Dictionary<SomeEnum, SomeClass>();
Run Code Online (Sandbox Code Playgroud)