是否可以使用需要类型参数的泛型类型参数?
即
public abstract class ClassA<T>
{}
public class ClassB<T>:ClassA<T>
{}
...
public void MethodA<T>() where T:ClassA, new()
{
T<string> x=new T<string>();
}
...
MethodA<ClassB>();
这会产生错误,因为ClassB在最后一行需要一个类型参数。
我是否可以使用一段缺少的语法来完成这项工作?
(旁注,这个问题在很大程度上是理论上的,因为如果没有上述内容我可以实现我想要的东西,但上述内容肯定会使用户端代码更清晰,尽管在MethodA中可能会更加混乱,因为反射几乎肯定会出现在在某些时候玩)
答案 0 :(得分:0)
您必须向MethodA
添加其他通用参数:
public void MethodA<T, K>() where T:ClassA<K>, new()
{
T<K> x=new T<K>();
}
或为ClassA泛型参数指定预定义值:
public void MethodA<T>() where T:ClassA<string>, new()
{
T<string> x=new T<string>();
}
您不能将ClassA指定为基类,因为实际上没有这样的comiled类。系统将为[每个]不同类型K编译几个不同的类。(实际上不是每个,但这是详细信息)。
由于ClassA只能与参数一起使用,如果您事先不知道它的类型,则必须在方法中添加另一个通用参数。
在某些情况下(从我看到的不是你的情况,但也许你又错过了一些东西),确实需要为所有泛型类都有一些基类。在这种情况下,您可以像这样创建它:
public class ClassABase
{ }
public abstract class ClassA<T> : CkassABase
{}
public void MethodA<T, K>() where T:ClassABase, new()
{
T<string> x=new T<string>();
}
答案 1 :(得分:0)
帮助您集体讨论解决方案:
public class ClassA<T>
{}
public class ClassB<T>:ClassA<T>
{}
...
public void MethodA<T1, T2>() where T1 : ClassA<T2>, new()
{
ClassA<T2> x=new ClassA<T2>();
}
...
public void MethodB<T1>()
{
ClassA<T1> x = new ClassA<T1>();
}
MethodA<ClassB>();
这取决于您的使用案例,这在您的问题中并不明显。