如何将C#泛型方法调用分派到专门的方法调用中

pae*_*bal 6 c# generics c#-4.0

我有以下C#类:

public class MyType<T>
{
   public void TryParse(string p_value)
   {
      T value ;

      Parser.TryParse(p_value, out value);

      // Do something with value
   }
}
Run Code Online (Sandbox Code Playgroud)

重点是调用正确的Parser.TryParse方法,具体取决于泛型类型T.

这使用以下静态类:

static public class Parser
{
   static public void TryParse(string p_intput, out object p_output)
   {
      // Do something and return the right value
   }

   static public void TryParse(string p_intput, out double p_output)
   {
      // Do something and return the right value
   }

   static public void TryParse(string p_intput, out int p_output)
   {
      // Do something and return the right value
   }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以工作:在最坏的情况下,将调用"对象"TryParse.相反,我有两个编译错误:

  • CS1502:'Parser.TryParse(string,out object)'的最佳重载方法匹配有一些无效的参数
  • CS1503:参数2:无法从'out T'转换为'out object'

问题1:我不明白为什么这不起作用:我可以天真,但不是所有C#对象都应该从"对象"派生出来?为什么T不能转换为对象?

问题2: 如何将具有泛型类型T的方法分配到正确的非泛型方法中(即根据正确的T类型MyType<T>.TryParse调用权限Parser.TryParse)?

注意

编辑问题以反映原始问题意图(如标题所示:如何将C#泛型方法调用分配到专门的方法调用中)

jas*_*son 6

其实,refout参数不允许类型变化.因此,要将变量传递给期望out object参数的方法,必须将该变量声明为object.

根据规范(§10.6.1.2和§10.6.1.3)

当形式参数是引用参数时,方法调用中的相应参数必须由关键字ref后跟一个与形式参数相同类型的变量引用(第5.3.3节)组成.

当形式参数是输出参数时,方法调用中的相应参数必须由关键字out后跟一个与形式参数相同类型的变量引用(第5.3.3节)组成.

请参阅:为什么refout参数不允许类型变化?了解原因.

额外问题:如何将具有泛型类型的方法分配T到正确的非泛型方法中(即根据正确的类型MyType<T>.TryParse调用权限)?Parser.TryParseT

我要把它转回来.你为什么做这个?如果你正在调用MyType<T>.TryParse,比方说MyType<int>.TryParse,为什么不Int32.TryParse直接打电话?什么是这个额外的层购买你?