【问题标题】:switch statement in C# and "a constant value is expected"C# 中的 switch 语句和“需要一个常量值”
【发布时间】:2009-01-21 19:08:40
【问题描述】:

为什么编译器对第一种情况说“需要一个常量值”……第二种情况很好……

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

【问题讨论】:

标签: c# visual-studio


【解决方案1】:

Properties.Settings.Default.OU_HomeOffice 不是一个常量字符串——在编译时就知道了。 C# switch 语句要求每个 case 都是编译时常量。

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

有关详细信息,请参阅 C# 3.0 规范的第 8.7.2 节。

【讨论】:

  • Jon - 告诉我你没有想到“C# 3.0 规范的第 8.7.2 节”。嘘......你也有第一个答案。
  • 不,别担心——我确实需要查一下。这实际上也在编辑中 - 但我怀疑如果它与原始帖子足够接近,SO 不会费心将其显示为编辑。
  • @Shimmy:到底什么是糟糕的行为?
  • 它必须是常量。我是 VB.NET 用户,其中 switch 语句非常灵活。
  • 对。不久前我爱上了VB,因为它是一种宽容的语言。但是由于我习惯了 C# 及其严格性,我意识到当所有的边缘都关闭时感觉会好得多。我确实将 VB.NET 用于 XML 和某些特定的事情。 C# 无法击败 VB.NET XML 文字。该功能是 VB.NET 的热点,我非常喜欢它!感谢您输入 Jon 摇滚吧!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    它的基本意思是,它需要确保每个案例的值在运行时不会改变。像在第二种情况下那样对字符串进行内联硬编码将确保该值在运行时不会改变(就像声明一个“const”变量并将硬编码的字符串分配为一个值一样)。

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

    如果您有一些“配置”值在您的应用程序中几乎保持不变,您可能会考虑创建一个类,您可以在其中将这些值硬编码为 const 变量并在您的 switch 语句中使用这些值。否则,您可能会不得不使用 if/else if 语句。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 2023-01-16
      • 2014-11-18
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      相关资源
      最近更新 更多