0

我是 C# 的初学者,并且有问题一直困扰着我。

如果有人提出解决方案,我将不胜感激。

我有一个类似的代码:

public class SomeClass 
{ 
  public SomeClass()
  {
    GenericMethod<Object1>(out result);
    ....
  }
  public void GenericMethod<T>(out Result result) where T : Parent
  {
     T t = new T();
     //do something need to be done all parent's child object ( Object1, Object2..)
     ...somthing same things...
     //and do specific things to be done relatively
     Handle(t, result);
  }
  // Object1 is child of Parent
  private void Handle(Object1 arg1, out Result result)
  {
    //do something need to be done for Object1;
  }
  // Object1 is child of Parent
  private void Handle(Object2 arg1, out Result result)
  {
    //do something need to be done for Object2;
  }
  ....
}

你会发现,我想做的很简单。

在 GenericMethod 中用 Type T 生成指定值,并调用指定的 Handle 方法。它可以在 C++ 中工作,但 C# 一直告诉我喜欢

“无法将 'T' 表达式转换为类型 'Object1'”

我怎么解决这个问题 ?提前谢谢。

4

1 回答 1

1

那是因为 C++ 泛型方法和类型是在编译类型时构造的。因此,当您调用 GenericMethod 时,编译器将为您构建该代码,并且会知道要调用哪个 Handle 方法。

编译器为您构建方法后,C++ 代码将如下所示:

public class SomeClass 
{ 
  public SomeClass()
  {
    GenericMethod<Object1>(out result);
    ....
  }
  public void GenericMethod<Object1>(out Result result)
  {
     Object1 t = new Object1();
     Handle(t, result);
  }
  private void Handle(Object1 arg1, out Result result)
  {
    //do something need to be done for Object1;
  }
  private void Handle(Object2 arg1, out Result result)
  {
    //do something need to be done for Object2;
  }
  ....
}

如您所见,现在非常清楚Handle编译器将使用什么方法。

C# 泛型在运行时编译。编译器看到对Handle具有未知类型的方法的调用,因此当您想在编译时调用具有未知类型的方法时,编译器会报错。

如果是参数中的类型,您实际上可以Handle在 C# 中使用泛型方法,如下所示:T

public void GenericMethod<T>(out Result result) where T : new(), BaseClass
{
     T t = new T();
     Handle(t, result);
}
private void Handle(BaseClass arg1, out Result result)
{
    //do something need to be done for BaseClass;
}

有关 C# 和 C++ 泛型的更多信息,您可以查看此处

于 2014-08-26T09:33:15.397 回答