如何修复switch操作符中的错误

时间:2012-07-16 11:53:53

标签: c# .net

我有一个名为config的类,其中包含两个名为key paramValue和parameterPath的字符串字段。

当我应用类的ChooseType方法时,该方法必须返回一个不同类型的变量paramValue(Int或bool或String)。

我按照以下方式实施了它:

class ConfigValue
{
    public string parameterPath;
    private string paramValue;

    public ConfigValue(string ParameterPath="empty",string ParamValue="empty")
    {
        this.parameterPath = ParameterPath;
        this.paramValue = ParameterPath;
    }

    public enum RetType { RetInt=1, RetBool, RetString };



    public  T ChooseType<T>(RetType how)
    {

        {

            switch(how)
             {
                case RetType.RetInt:

                     return int.Parse(string this.paramValue);
                        break;

                case RetType.RetBool:

                    return  Boolean.Parse(string this.paramValue);
                        break;

                case RetType.RetString:

                       return this.paramValue;
                      break;
             }

         }
    }

}

但是,我在下一行的switch操作符中出错:

 return int.Parse(string this.paramValue);

错误:

  

只能将赋值,调用,递增,递减和新对象表达式用作语句。

 return  Boolean.Parse(string this.paramValue);

错误:

  

表达式术语'string'无效。

 return this.paramValue;

错误:

  

无法将类型'string'隐式转换为'T'。

我知道为什么会出现这些错误以及如何修复代码?

3 个答案:

答案 0 :(得分:6)

  

我知道为什么会出现这些错误?

编译器不知道T会是什么,并且它不知道如何隐式地从stringboolint转换为T }。

  

我该如何修复代码?

您可以通过显式转换为object,然后转换为T

return (T) (object) int.Parse(string this.paramValue);

“通过”object的要求有点奇怪 - Eric Lippert有一个blog post going through this in more detail

答案 1 :(得分:1)

public T ChooseType<T>(RetType how)
{
    switch (how)
    {
        case RetType.RetInt:
            return (dynamic)int.Parse(paramValue);
        case RetType.RetBool:
            return (dynamic)Boolean.Parse(paramValue);
        case RetType.RetString:
            return (dynamic)paramValue;
        default:
            throw new ArgumentException("RetType not supported", "how");
    }
}

调用某个方法时,不应指定参数类型。仅适用于方法声明的参数类型。因此只需传递参数:

int.Parse(this.paramValue) // you can use class members without this keyword
int.Parse(paramValue)

此外,您应该为您的交换机块添加default分支(如果向您的方法传递了错误的参数值,则必须返回一些内容)。

如果您已使用break,则无需return切换分支。

要将某些类型转换为通用值,您应该使用dynamic,或通过对象进行双重转换:

return (dynamic)int.Parse(paramValue);
return (T)(object)int.Parse(paramValue);

答案 2 :(得分:1)

问题是你声明函数的返回类型是T.由于T可以是任何类型,你不能明确地返回int,string或任何特定类型。您可能想尝试使用一个返回指令,如

public  T ChooseType<T>() 
{
    return (T)this.paramValue;
}

然后,在调用函数时,指定T,如下所示:

int a = ChooseType<int>();

string a = ChooseType<string>();

请记住,如果paramValue无法转换为T,则会抛出错误。