跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一下 C#中枚举作为字典 key 时的行为,感觉很怪
未分類
31 1 月 2021

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

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

資深大佬 : lights 4

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
请教一下有没有相关的介绍说明,感觉这一块是个挺奇怪的默认行为

大佬有話說 (4)

  • 資深大佬 : yejinmo

    1. 所有的小写的 `enum` 都派生于大写的 `Enum`,前者是关键字,也就是你这个 `AlphaEnum` 和 `BetaEnum`,而后者是个类,派生类不同他们的 HashCode 自然不同
    2. 最后输出应该是两个 A,这是因为 `Enum` 类自带的 ToString() 方法导致的,和他们本身的值无关

  • 主 資深大佬 : lights

    @yejinmo #1
    所以 C#字典把一个对象作为 key 时,用的是 HashCode ?才知道这个说法

  • 主 資深大佬 : lights

    @yejinmo #1
    上面示例代码中的两个 Enum 用 GetHashCode() 方法返回的都是 0

  • 資深大佬 : yejinmo

    @lights #3

    GetHashCode() 的值相等时会进一步调用 Equals() 方法

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具