1

I have a class named config with two string fields named key paramValue and parameterPath.

When I apply the ChooseType method of the class, the method has to return one variable paramValue in different types (Int or bool or String).

I implemented it as follow:

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;
             }

         }
    }

}

But,I get error in switch operator in the next rows:

 return int.Parse(string this.paramValue);

Error:

Only assignment, call, increment, decrement, and new object expressions can be used as a statement.

 return  Boolean.Parse(string this.paramValue);

Error:

Invalid expression term 'string'.

 return this.paramValue;

Error:

Cannot implicitly convert type 'string' to 'T'.

Any idea why do I get these errors and how can I fix the code?

4

3 回答 3

6

知道为什么我会收到这些错误吗?

编译器不知道会是什么,T也不知道如何隐式转换 fromstring或to 。boolintT

以及如何修复代码?

您可以先显式转换为object,然后再转换为T

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

“通过”的要求object有点奇怪 - Eric Lippert 有一篇博客文章更详细地介绍了这一点

于 2012-07-16T11:57:47.727 回答
1

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

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

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

int a = ChooseType<int>();

或者

string a = ChooseType<string>();

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

于 2012-07-16T12:11:47.053 回答
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为您的 switch 块添加分支(如果将不正确的参数值传递给您的方法,则必须返回一些内容)。

此外,break如果您已经使用过return.

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

return (dynamic)int.Parse(paramValue);
return (T)(object)int.Parse(paramValue);
于 2012-07-16T11:57:30.497 回答