使用泛型方法,是否可以从同一方法中获取不同的类型?

时间:2010-01-22 21:49:52

标签: c# generics

我可以这样:

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

5 个答案:

答案 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。

泛型不是变体 - 即可以容纳任何东西的类型 - 它们是编译时解析为真实类型的。您的代码无法编译,因为它不应该编译。您可以使用此处发布的一些黑客来解决编译时问题,但这确实是一个逻辑问题。退一步重新考虑你想要做的事情,而不是试图绕过编译器。