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

joh*_*nie 50 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.case语句给出了一个错误,说明了一个常量变量.请大家帮忙谢谢!

dee*_*ee1 31

请参阅 C#switch语句限制 - 为什么?

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

  • 这在VB.net中是不正确的...我试图转换已经具有这种案例值的代码(基本上是方法调用) (5认同)
  • @Moslem Ben Dhaou是C#Switch绝对不等同于VB Case语句.对于Case语句,您可以使用表达式(函数调用,变量等),而C#需要常量值(没有函数调用,变量等).switch语句相当有限. (3认同)

Max*_*erl 27

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

例:

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

有效,但是

switch (variable1)
{
    case variable2:
        // Code
        break;
    default:
        // Code
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • 另外注意:"const int myConstant = 3"计为常量,但"readonly static int myReadonlyStatic = 3"不计算. (17认同)

0xF*_*0xF 17

现在您可以使用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

nameof 出现在 C# 6.0 中,所以在问这个问题之后。


MjH*_*MjH 10

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

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

  • 也许使用丢弃 var 而不是 var 值并测试variable_1 ==variable_2。`case var _ 当变量_1 == 变量_2 时:` (6认同)
  • 您可以使用它,因为 C#7 中的开关中有新的模式匹配实现 (3认同)
  • 我宁愿有一个大的“if else if else”,也不愿使用这个曲棍球解决方案 (3认同)
  • 哎哟,谢谢!!!为什么这到底有效?!?!它也可以与 _C# 8.0 变量开关 lambda_ 一起使用: `variable_1 switch` `var value when value == variable_2:` (2认同)

iDe*_*Fun 9

您不能对此使用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Kor*_*rey 8

至少当我尝试使用 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 与 VS2017 无关。Words.temp 和 Words.temp2 仍然是常量。编译 Switch 语句时,编译器会将“case 值”替换为其实际值。只要编译器能够获得要使用的常量值,它就可以正常工作。 (3认同)