我有一个名为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'。
我知道为什么会出现这些错误以及如何修复代码?
答案 0 :(得分:6)
我知道为什么会出现这些错误?
编译器不知道T
会是什么,并且它不知道如何隐式地从string
,bool
或int
转换为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,则会抛出错误。