C# C“and”中的switch语句;“需要一个常量值”;

C# C“and”中的switch语句;“需要一个常量值”;,c#,visual-studio,C#,Visual Studio,为什么编译器对第一种情况说“需要一个常量值”…第二种情况很好 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:  
        //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;
 }
…同样的错误

这是属性。设置代码

[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"]));
    }
}

Properties.Settings.Default.OU\u HomeOffice
不是一个常量字符串—编译时已知的字符串。C#switch语句要求每种情况都是编译时常量

(除此之外,这是它知道不会有任何副本的唯一方法。)


有关更多详细信息,请参见C#3.0规范第8.7.2节。

这是因为无法在编译时确定该值(因为它来自配置设置)。您需要提供编译代码时已知的值(常量)。

它的基本意思是需要确保每种情况的值在运行时不会更改。像在第二种情况下那样在线硬编码字符串将确保值在运行时不会更改(声明“const”变量并将硬编码字符串作为值分配给它也是如此)

第一种情况是调用类的属性,编译器在编译时不知道该类的值


如果你有一些“配置”值在你的应用程序中是非常恒定的,那么你可以考虑创建一个类,在这些类中你可以硬编码这些值是const变量,并使用你的Switter语句中的那些。否则,您可能不得不使用if/else if语句。

Jon-告诉我您没有想到“C#3.0规范第8.7.2节”。嘘……你也得到了第一个答案。不,别担心,我确实得查一下。这实际上也是一个编辑,但我想如果它与原始帖子的距离足够近,那么就不用麻烦将其显示为编辑了。@Shimmy:到底什么是糟糕的行为?它一定是常量。我是一个VB.NET用户,其中switch语句非常灵活。对。不久前我爱上了VB,因为它是一种宽容的语言。但自从我习惯了C#和它的严格性,我意识到当所有的边缘都闭合时,感觉好多了。我确实使用VB.NET处理XML和一些特定的事情。C#无法击败VB.NET XML文本。这个功能是VB.NET热度,我非常喜欢它!谢谢你的投入乔恩摇滚吧!见问题: