请教一下 C#中枚举作为字典 key 时的行为,感觉很怪

2021-02-01 19:07:25 +08:00
 lights
using System;
using System.Collections.Generic;

namespace cSharpSolution
{
    internal class Program
    {
        public enum AlphaEnum
        {
            A, B, C
        };

        public enum BetaEnum
        {
            A, B, C
        }

        /// <summary>
        /// 测试 c# 的 Enum 作为字典的 key 是什么?
        /// </summary>
        /// <param name="args"></param>
        private static void Main(string[] args)
        {
            var d = new Dictionary<Enum, int>();
            d[AlphaEnum.A] = 111;
            d[BetaEnum.A] = 222;

            Console.WriteLine($"d[AlphaEnum.A] : {d[AlphaEnum.A]} ");
            Console.WriteLine($"d[BetaEnum.A] : {d[BetaEnum.A]} ");

            foreach (var item in d)
            {
                Console.WriteLine($"<{item.Key} : {item.Value} >");
            }
        }
    }
}

源码如上,拷贝到文件里可直接运行
主要疑问在定义了一个 <Enum, int> 的字典,以 Enum 为 key 的时候
原本以为 Enum 会转换成 int,后面的赋值会覆盖前面的赋值
但实际上应该是转换成了 <类型+int> 的一个字符串或者怎样的东西,使得不同的 enum 类型的 “0 值” 可以作为不重复的 key
请教一下有没有相关的介绍说明,感觉这一块是个挺奇怪的默认行为

1846 次点击
所在节点    C#
6 条回复
yejinmo
2021-02-01 19:37:47 +08:00
1. 所有的小写的 `enum` 都派生于大写的 `Enum`,前者是关键字,也就是你这个 `AlphaEnum` 和 `BetaEnum`,而后者是个类,派生类不同他们的 HashCode 自然不同
2. 最后输出应该是两个 A,这是因为 `Enum` 类自带的 ToString() 方法导致的,和他们本身的值无关
lights
2021-02-02 09:41:41 +08:00
@yejinmo #1
所以 C#字典把一个对象作为 key 时,用的是 HashCode ?才知道这个说法
lights
2021-02-02 09:45:32 +08:00
@yejinmo #1
上面示例代码中的两个 Enum 用 GetHashCode() 方法返回的都是 0
yejinmo
2021-02-02 10:37:03 +08:00
@lights #3

GetHashCode() 的值相等时会进一步调用 Equals() 方法
forgottencoast
2021-02-08 00:47:26 +08:00
@lights 可以看看《 CLR via C#》,这本书应该都有讲。
lights
2021-02-08 11:22:28 +08:00
@forgottencoast
这本书排在很后面了,先看 shader,多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/750397

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX