我是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'类型”
我该如何解决这个问题? 提前完成。
答案 0 :(得分: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
方法的调用,因此编译器在编译时想要调用具有unkonwn类型的方法时会抱怨。
如果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 ++泛型的更多信息,您可以查看here