枚举作为字典键

19

假设已经拥有

enum SomeEnum { One, Two, Three };

SomeEnum是一个枚举类型,因此应该继承自Enum,那么为什么如果我写:

Dictionary<Enum, SomeClass> aDictionary = new Dictionary<SomeEnum, SomeClass>();
编译器报错,无法隐式转换SomeEnum为Enum?

请查看 Enum - Alessandro D'Andria
@AlessandroD'Andria "为枚举提供基类。" - Cristian Lupascu
文档的第一行:提供枚举的基类。基类不是父类吗? - sblandin
是的,但枚举很奇怪,不要像对待其他类一样思考枚举。 - Alessandro D'Andria
1
@AlessandroD'Andria 为什么不呢?在这种情况下它们是等价的。这里是使用常规类的相同错误:http://ideone.com/BbLGdH - Cristian Lupascu
@w0lf 你是对的,抱歉。 - Alessandro D'Andria
2个回答

24

我认为这是因为协变性

简而言之:

aDictionary将成为Dictionary<SomeEnum,SomeClass>,但在当前上下文中,它被称为Dictionary<Enum, SomeClass>

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

aDictionary.Add(someValueFromAnotherEnumUnrelatedToSomeEnum, aValue);

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

这就是为什么默认情况下不允许协变,而在有意义的情况下必须明确启用它。

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

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

2

在其声明中,枚举不是等于 SomeEnum 的类。它应该是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接