在C#中切换案例 - 预期是一个常量值

时间:2011-09-29 06:35:35

标签: c# switch-statement

我的代码如下:

public static void Output<T>(IEnumerable<T> dataSource) where T : class
{   
    dataSourceName = (typeof(T).Name);
    switch (dataSourceName)
    {
        case (string)typeof(CustomerDetails).Name.ToString(); :
            var t = 123;
            break;
        default:
            Console.WriteLine("Test");
    }
}

但这不起作用。 case语句给出了一个错误,说明了一个常量变量。请帮助伙计们谢谢你们!

7 个答案:

答案 0 :(得分:29)

请参阅 C# switch statement limitations - why?

基本上,开关不能在case语句中包含evaluate语句。必须对它们进行静态评估。

答案 1 :(得分:25)

您只能匹配switch语句中的常量。


示例:

switch (variable1)
{
    case 1: // A hard-coded value
        // Code
        break;
    default:
        // Code
        break;
}

成功!


switch (variable1)
{
    case variable2:
        // Code
        break;
    default:
        // Code
        break;
}

CS0150预计会有一个常数值。

答案 2 :(得分:7)

您不能对此使用switch语句,因为案例值无法计算表达式。为此,你必须使用if / else ...

public static void Output<T>(IEnumerable<T> dataSource) where T : class
{   
    dataSourceName = (typeof(T).Name);
    if(string.Compare(dataSourceName, typeof(CustomerDetails).Name.ToString(), true)==0)
    {
        var t = 123;
    }
    else if (/*case 2 conditional*/)
    {
        //blah
    }
    else
    {
        //default case
        Console.WriteLine("Test");
    }
}

我也冒昧地整理你的条件陈述。调用ToString()后无需强制转换为字符串。无论如何,这总是会返回一个字符串。在比较字符串是否相等时,请记住使用==运算符将导致区分大小写的比较。最好使用string compare = 0和最后一个参数来设置区分大小写的开/关。

答案 3 :(得分:3)

Johnnie,请浏览switch上的msdn指南。此外,C#语言规范明确定义了编译时错误情况:

  

•如果switch表达式的类型是sbyte,byte,short,ushort,   int,uint,long,ulong,bool,char,string或enum-type,或者如果它   是可以为这些类型之一的可空类型,那就是   switch语句的控制类型。

     

•否则,只需要一个用户定义的隐式转换(第6.4节)   从switch表达式的类型到以下之一   可能的管理类型:sbyte,byte,short,ushort,int,uint,long,   ulong,char,string或者,对应于其中一个的可空类型   那些类型。

     

•否则,如果不存在此类隐式转换,或者如果不存在   存在一个这样的隐式转换,发生编译时错误。

希望这有帮助。

答案 4 :(得分:2)

在开关中的值必须是编译时常量的意义上,

开关非常挑剔。并且被比较的值必须是基元(或现在的字符串)。为此,您应该使用if语句。

原因可能会回到C处理它们的方式,因为它创建了一个跳转表(因为这些值是编译时常量)并且它试图通过不允许在你的情况下使用评估值来复制相同的语义。 p>

答案 5 :(得分:2)

至少在尝试使用Visual Studio 2017时,这似乎对我有用。

public static class Words
{
     public const string temp = "What";
     public const string temp2 = "the";
}
var i = "the";

switch (i)
{
  case Words.temp:
    break;
  case Words.temp2:
    break;
}

答案 6 :(得分:0)

现在您可以使用nameof

public static void Output<T>(IEnumerable<T> dataSource) where T : class
{
    string dataSourceName = typeof(T).Name;
    switch (dataSourceName)
    {
        case nameof(CustomerDetails):
            var t = 123;
            break;
        default:
            Console.WriteLine("Test");
    }
}

nameof(CustomerDetails)与字符串文字"CustomerDetails"基本相同,但是在编译时检查它是否引用了某个符号(防止输入错误)。

nameof出现在C#6.0中,因此在问了这个问题之后。