switch语句:"预期值为常量"

Mic*_*ing 2 c# switch-statement

目前我正在与那个"神奇的弦乐"问题作斗争:

public class MyDataField
{
    // class definition
}

// exuecuted method
public void SwitchMultipleDataFields()
{
    var myField = new MyDataField();
    switch(myField.GetType().ToString())
    {
        // only case, which works
        case "MyDataField":
            // case operations
            break;

        // other option:
        case typeof(MyDataField).ToString():
            // case operations
            break;

        // other cases of other FieldTypes
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我收到错误消息我写在我的线程标题中.我认为问题是这个字符串不是"非编译时"的常量.因此,要求切换的唯一可能方法是通过明确确定该案例字符串的值.我的问题只是我没有得到编译错误,以防我重命名MyDataField该类.因此,无论如何,这些类中有90%是通用的.这些是在defaultswitch语句中处理的.除了明确确定案例值的价值之外,还有其他方法吗?

请不要争论这种方法的意义.我刚刚写了这篇文章以便更简单地说明我的问题

Ond*_*cny 11

只需使用if:

Type type = myField.GetType();
if (type == MyDataField.GetType())
{
    …
}
else if (type.ToString() == "MyDataField")
{
    …
}
else
{
    …
}
Run Code Online (Sandbox Code Playgroud)

您甚至不需要直接比较类型名称,而是比较Type对象(引用).


jas*_*son 6

我将您引用到规范§8.7.2中,该规范声明了以下语法switch-label:

switch-label:
    case constant-expression:
    default:
Run Code Online (Sandbox Code Playgroud)

简单地说,case标签在编译时必须是常量.请注意,这typeof(MyDataField).ToString()不是编译时常量(它可能看起来不变,但并不是因为它在编译时无法完全评估).规范的第7.19节非常清楚地说明了常量是什么

您需要将其重新编码为if/else if/else.