我可以这样:
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";
}
}
答案 0 :(得分:10)
尝试以下
public static T MyMethod<T>() {
if ( typeof(T) == typeof(Int32) ) {
return (T)(object)0;
} else {
return (T)(object)"nothing";
}
}
这里的诀窍就是施放到object
。你要做的事情本质上是不安全的,因为编译器无法推断0或“无”可转换为任何给定的T
。毕竟它是无限的。因此,只需告诉编译器,将其转换为object
是不安全的。
答案 1 :(得分:1)
稍微偏离主题,但如果你想做这件事那么可能是你的设计错了......
为什么不重载方法并将结果设置为out参数:
void MyMethod(out int result)
{
result=0;
}
void MyMethod(out string result)
{
result="my value";
}
然后你可以说:
int value;
MyMethod(out value);
编译器将选择正确的版本
答案 2 :(得分:0)
如果你想要一个“null”类型值,如果它不是int,你可以这样做。但是如果你想在所有其他情况下使用字符串,请检查其他答案。
public static T MyMethod<T>()
{
if(typeof(T) == typeof(Int32))
{
return (T)(object)0;
}
else
{
return default(T); // or null
}
}
答案 3 :(得分:0)
@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);
}
答案 4 :(得分:0)
这是无效的,因为无法保证T可转换/可转换为string或int。
泛型不是变体 - 即可以容纳任何东西的类型 - 它们是编译时解析为真实类型的。您的代码无法编译,因为它不应该编译。您可以使用此处发布的一些黑客来解决编译时问题,但这确实是一个逻辑问题。退一步重新考虑你想要做的事情,而不是试图绕过编译器。