编译器检查字典中的键是否唯一

时间:2016-08-24 20:34:37

标签: c#

如果我的静态词典中有重复的键,我希望有一个错误提升来阻止构建。

我目前的词典

public static readonly Dictionary<string, string> Fruits = new Dictionary<string, string>
{
    {"Sobeys", "Apples"},
    {"NoFrills", "Oranges"}
}

但是,让我们说有人不小心将Sobeys改为Nofrills,我想提出一个编译器错误,以防止在重复密钥解决之前完成任何事情。请问有可能吗?如果是这样我会怎么做?

public static readonly Dictionary<string, string> Fruits = new Dictionary<string, string>
{
    {"NoFrills", "Apples"},
    {"NoFrills", "Oranges"}
}

4 个答案:

答案 0 :(得分:8)

不,那是一个运行时的东西。只要将类加载到内存中,它就会抛出异常(这本身就是运行时)。

您可以通过诊断分析仪添加自定义检查,但这会带来很大的痛苦,但收效甚微。我建议您保持原样并密切关注新部署的任何异常。你总是可以添加一个评论,让其他开发者明白密钥必须是唯一的,但你在哪里停止?开发人员应该知道这样的基本框架规则。

例如,您还可以使用枚举作为键,当您尝试添加已存在的内容时,它会在devtime时清除它。另一个选择是引用const string字段,尽管它仍然有些脆弱。

答案 1 :(得分:7)

您还可以使用以下hack(我不推荐):将匿名类型转换为字典。 匿名类型不允许重复的属性名称。

示例:

Dictionary<string, string> Fruits = ToDictionary(
   new
   {
      Sobeys = "Apples",
      NoFrills = "Oranges"
   }
);

但是这种方法有以下限制:您只能将有效的标识符作为字典中的键。

如何实现ToDictionary方法: In c# convert anonymous type into key/value array?

答案 2 :(得分:1)

C#编译器没有提供这种可能性。 您将在运行时获得异常。

要解决此问题,您必须实现自己的预处理检查或处理运行时异常。

答案 3 :(得分:1)

  

我想要引发编译器错误

错误。这就是编译器不会发出编译时错误的原因。集合初始化程序是语法糖,并被转换为相应的Add()方法(或备用语法的索引器)调用。

您最好的选择是依靠一些可以发现此类潜在错误的第三方代码分析工具。