具有动态参数的积分型预期开关的值

Bel*_*l09 9 c# exception switch-statement dynamic-variables object-to-string

只是出于好奇.

如果我有以下代码

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

我得到错误"开关表达式或案例标签必须是bool,char,string,integral,enum或相应的可空类型"

但如果我有以下代码

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

一切都很好.如果交换机正在检查Type string和ToString()的变量,那是什么区别?或者是因为在调用ToString()之前有机会抛出异常?

Jon*_*yna 12

我认为问题在于你的exception变量是一个dynamic对象.由于它是动态的,因此在编译时不会解析其类型,也不会调用任何方法的类型.

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

switch (exception.GetType().ToString() as string)
Run Code Online (Sandbox Code Playgroud)

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

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

查看Format函数的内容,如果您exception作为一个函数传入,则可以实现相同的功能object.如果您使用此功能进行Exceptions特定格式化,则最好将其Exception用作exception参数类型.