c#中的切换情况-期望常量值

本文关键字:期望 常量 情况 | 更新日期: 2023-09-27 18:10:04

我的代码如下:

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语句给了我一个错误,说期望有一个常数变量。请帮忙,谢谢!

c#中的切换情况-期望常量值

有一个技巧是与我分享的(不要问细节-将无法提供它们,但它适用于我):

switch (variable_1)
{
    case var value when value == variable_2: // that's the trick
        DoSomething();
        break;
    default:
        DoSomethingElse();
        break;
}

见c# switch语句限制-为什么?

基本上,switch不能在case语句中使用求值语句。它们必须静态地求值。

只能匹配switch语句中的常量


的例子:

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

成功!


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

CS0150期望一个常量

现在您可以使用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中,所以在问了这个问题之后

不能使用switch语句,因为case值不能被求值表达式。为此,您必须使用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。这将总是返回一个字符串。在比较字符串是否相等时,请记住使用==操作符将导致区分大小写的比较。最好对最后一个参数使用string compare = 0来设置区分大小写的开/关。

这似乎至少在我尝试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;
}

switch非常挑剔,因为switch中的值必须是编译时常数。而且被比较的值必须是一个原语(或者字符串)为此,您应该使用if语句。

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

Johnnie,请查看msdn交换机指南。此外,c#语言规范清楚地定义了编译时错误的情况:

•如果switch表达式的类型为sbyte, byte, short, ushort,Int, uint, long, ulong, bool, char, string,或enum类型,或if可空类型是否对应于这些类型之一switch语句的控制类型。

•否则,必须只有一个用户定义的隐式转换(§6.4)从switch表达式的类型存在到以下类型之一可能的控制类型:sbyte, byte, short, ushort, int, uint, long,Ulong、char、string或对应于其中一种的可空类型这些类型。

•否则,如果不存在这样的隐式转换,或者大于如果存在这样的隐式转换,则会发生编译时错误。

这确实需要最新或接近最新版本的c#。这样做的好处是,本例中的变量"value"可以像这样操作,

   switch (args[1])
                {
                    case var value when string.Equals(value, "SELECT_ALL", StringComparison.OrdinalIgnoreCase):
{
....
break;
}
   case var value when string.Equals(value, "UNSELECT_ALL", StringComparison.OrdinalIgnoreCase):
                        {
...
...
break;
}

等。等。

确保你永远不会匹配到错误的文字,在这种情况下,因为你忘记使用ToUpper()或其他…