使用泛型方法,是否有可能从相同的方法获取不同的类型?
我能有这样的事情:使用泛型方法,是否有可能从相同的方法获取不同的类型?
int x = MyMethod<int>();
string y = MyMethod<string>();
所以,一个方法返回基于T.当然,不同类型,会有里面的方法逻辑,以确保它返回正确的事情。
我永远无法得到像这样的东西来运行。它抱怨说,它不能返回值转换为T:
public static T MyMethod<T>()
{
if(typeof(T) == typeof(Int32))
{
return 0;
}
else
{
return "nothing";
}
}
请尝试以下
public static T MyMethod<T>() {
if (typeof(T) == typeof(Int32)) {
return (T)(object)0;
} else {
return (T)(object)"nothing";
}
}
这里的窍门是铸造object
。你试图做的事情本质上是不安全的,因为编译器不能推断0或“无”可转换为任何给定的T
。毕竟它是无限的。所以,只需告诉编译器将其转换为object
并不安全。
这个工程。所以,唯一觉得你做得不同的事情是先把它投射到一个物体上,然后再投射到T? – Deane 2010-01-22 22:03:34
虽然这解决了编译时错误,但它仍然没有意义。如果T是一个页面类型,那么通过这个(对象)hack将一个字符串转换为T是没有意义的。这个编译的唯一原因是因为字符串和整数都可以转换为对象,并且对象可以是它们的后代类型(即所有内容)的大小写。 – 2010-01-22 22:17:08
如果你想要返回一个“null”类型的值,如果它不是int,你可以这样做。但是如果你想在所有其他情况下使用字符串,请检查其他答案。
public static T MyMethod<T>()
{
if(typeof(T) == typeof(Int32))
{
return (T)(object)0;
}
else
{
return default(T); // or null
}
}
@Nick在他的评论中是正确的,你的代码不会编译。但是,假设你的意思:
public static T MyMethod<T>()
{
if(typeof(T) == typeof(Int32))
{
return 0;
}
else
{
return "nothing";
}
}
它可能会非常棘手,使仿制药非一般像你正试图(和真正违反整点),但这应该工作:
public static T MyMethod<T>()
{
if(typeof(T) == typeof(Int32))
{
return (T)(object)0;
}
else if(typeof(T) == typeof(string))
{
return (T)(object)"nothing";
}
return default(T);
}
这ISN” t有效,因为不能保证T可以被转换/可转换为字符串或int。泛型不是变体 - 即可以容纳任何东西的类型 - 它们被编译时解析为真实类型。你的代码不会编译,因为它不应该。您可以使用这里发布的一些黑客来解决编译时问题,但这确实是一个逻辑问题。退后一步,重新思考你想要做什么,而不是试图绕过编译器。
稍微偏离主题,但如果你试图做这件事情那么它可能是你的设计是错误的...
为什么不超载的方法和结果设置为出放慢参数:
void MyMethod(out int result)
{
result=0;
}
void MyMethod(out string result)
{
result="my value";
}
然后你就可以说:
int value;
MyMethod(out value);
,编译器将选择合适的版本
˚F首先,这段代码不会编译,因为没有指定返回类型。我假设你想要它读取'公共静态T MyMethod()' –
Nick
2010-01-22 21:51:44
作为你的答案,尼克。我认为这是他需要的解决方案。 – JMD 2010-01-22 21:53:21
...虽然上面编写的代码仍然不会编译,因为“Nothing”不是T,除非T是字符串,并且0不是T,除非T是数字类型。 – JMD 2010-01-22 21:54:53