为什么编译器会说"第一种情况需要一个常量值"......第二种情况正常......
switch (definingGroup) { case Properties.Settings.Default.OU_HomeOffice: //do something break; case "OU=Home Office": //do something break; default: break; }
还试过......
switch (definingGroup) { case Properties.Settings.Default.OU_HomeOffice.ToString(): //do something break; case "OU=Home Office": //do something break; default: break; }
......同样的错误
这是Properties.Setting代码
[global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("OU=Home Office")] public string OU_HomeOffice { get { return ((string)(this["OU_HomeOffice"])); } }
Jon Skeet.. 40
Properties.Settings.Default.OU_HomeOffice
不是一个常量字符串 - 在编译时已知.C#switch语句要求每个case都是一个编译时常量.
(除了其他任何东西,这是唯一可以知道不会有任何重复的方式.)
有关更多详细信息,请参阅C#3.0规范的第8.7.2节.
Properties.Settings.Default.OU_HomeOffice
不是一个常量字符串 - 在编译时已知.C#switch语句要求每个case都是一个编译时常量.
(除了其他任何东西,这是唯一可以知道不会有任何重复的方式.)
有关更多详细信息,请参阅C#3.0规范的第8.7.2节.
这是因为在编译时无法确定该值(因为它来自配置设置).您需要提供编译代码时已知的值(常量).
它基本上说的是它需要确保每个案例的值在运行时不会改变.像在第二种情况下一样对内联字符串进行硬编码将确保该值在运行时不会改变(如同声明'const'变量并将硬编码字符串指定为值一样).
第一种情况是调用类的属性,编译时编译器不知道其值.
如果你有一些"配置"值几乎要在你的应用程序中保持不变,你可以考虑创建一个类,你可以硬编码这些值是const变量并在switch语句中使用它们.否则,您可能会不得不使用if/else if语句.