【问题标题】:value of integral type expected switch with dynamic parameter带动态参数的整型期望开关的值
【发布时间】:2014-02-14 12:58:37
【问题描述】:

只是出于好奇。

如果我有以下代码

public static string Format(dynamic exception)
{
    switch (exception.GetType().ToString())
    {
        case "test":
            return "Test2";
    }
    return null;
}

我收到错误“开关表达式或案例标签必须是布尔、字符、字符串、整数、枚举或相应的可空类型”

但如果我有以下代码

public static string Format(dynamic exception)
{
    string test = exception.GetType().ToString();
    switch (test)
    {
        case "test":
            return "Test2";
    }
    return null;
}

一切编译正常。如果 switch 正在检查 Type string 和 ToString() 的变量,有什么区别?还是因为在调用 ToString() 之前有机会抛出异常?

【问题讨论】:

    标签: c# exception switch-statement dynamic-variables object-to-string


    【解决方案1】:

    我认为问题在于您的 exception 变量是 dynamic 对象。由于它是动态的,它的类型在编译时不会被解析,也不会在它上面调用任何方法的类型。

    因此,第一种情况下的 switch 语句不知道 .GetType() 方法或 .ToString() 方法将返回什么类型。如果你想让它工作,你可以像这样投射它:

    switch (exception.GetType().ToString() as string)
    

    在您的第二个代码块中,您明确声明exception.GetType().ToString() 的结果将是一个字符串。在这种情况下,编译器知道传入 switch 语句的变量的类型。

    就异常而言:编译器并不关心您的方法调用是否可能引发异常。如果是这样,异常将从 switch 语句中冒出并从您的方法调用中抛出。

    查看Format 函数的内容,如果将exception 作为object 传递,则可以实现相同的功能。如果您使用此函数专门格式化 Exceptions,则最好使用 Exception 作为 exception 参数的类型。

    【讨论】:

      【解决方案2】:

      我重构一个方法后发现了这个问题,发现同样的错误,

      除了 Jon Senchya 提供的答案之外,我还得到了从如下方法返回的开关值

        var action = Utilities.ConvertAction(x.action);
        switch (action)
        {
                  case GridActions.ADD:
                    MethodX();
                    break;
                  case GridActions.UPDATE:
                    MethodX();
                    break;
                  case GridActions.DELETE:
                    MethodX();
                    break;
                  default: throw new WebException("Invalid action.");
        }
      

      因为ConvertAction 方法中有一个 throw 异常,所以 switch 不会执行, 这已通过使action 硬输入来解决错误已解决:

        GridActions action = Utilities.ConvertAction(x.action);
        switch (action)
        {
                  case GridActions.ADD:
                    MethodX();
                    break;
                  case GridActions.UPDATE:
                    MethodX();
                    break;
                  case GridActions.DELETE:
                    MethodX();
                    break;
                  default: throw new WebException("Invalid action.");
        }
      

      【讨论】:

      • 我猜你的问题源于Utilities.ConvertAction 没有返回GridActions,而是其他类型。 var 是强类型;它只是从分配中推断出它的类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多