我只是在学习泛型,并对方法返回值有疑问。
说,我想要一个泛型方法,因为方法签名所需的通用部分只是返回值。该方法将始终采用一个字符串作为其参数,但可以返回double或int。这可能吗?
实际上我想取一个字符串,解析其中包含的数字(可以是double或int),然后返回该值。
感谢。
答案 0 :(得分:16)
这样的东西?
void Main()
{
int iIntVal = ConvertTo<int>("10");
double dDoubleVal = ConvertTo<double>("10.42");
}
public T ConvertTo<T>(string val) where T: struct
{
return (T) System.Convert.ChangeType(val, Type.GetTypeCode(typeof(T)));
}
答案 1 :(得分:10)
您不能从通用方法返回double
或int
,也不会返回任何其他类型。
Foo
类,你的通用解析方法没有任何约束,将允许进行这个调用:
Foo result = Parse<Foo>("111");
你可以用数字做的最好的事情是只允许使用struct
(值 - 类型)来限制你的功能。
T Parse<T>(string value) where T : struct;
但这将允许所有数字类型,以及任何其他值类型。
您可以按接口类型进行约束,但INumeric
或double
上没有int
界面,因此您会陷入困境。
如果传入了错误的类型,你唯一能做的就是抛出异常 - 这通常不是很令人满意。
在这种情况下,您最好的方法是放弃泛型并使用单独命名的方法。
double ParseDouble(string value);
int ParseInteger(string value);
但是,当然,这不会帮助你学习泛型。遗憾。
答案 2 :(得分:9)
是的,这是可能的。
public T ParseValue<T>(String value) {
// ...
}
答案 3 :(得分:2)
你可以做点像......
public TResult Parse<TResult>(string parameter)
{
/* do stuff */
}
并像......一样使用它。
int result = Parse<int>("111");
然后它将取决于您在Parse方法中的实现。
希望它有所帮助。