我有以下代码:
public class Generic1<T, T2> where T : Generic2<T2>
where T2 : new()
{
}
public class Generic2<T> where T : new()
{
public T GetT()
{
return new T();
}
}
这使得有可能做到:
var g = new Generic1<Generic2<int>, int>();
但我真正想要的是像这样使用它(但保留它必须是Generic2类型的约束(:
var g = new Generic1<Generic2<int>();
既然T2已经很清楚了,为什么我必须单独指定它?我做不到:
var g = new Generic1<Generic2<int>, double>();
那么,有没有办法改变Generic1或Generic2来实现这一点?类似:
public class Generic1<T> where T : Generic2<T2>
{
}
但这并不能编译:(
编辑I
也许我问错了。这是一个非常简单的例子。我需要T是Generic2 类型
如果T
总是Generic2<T2>
,那么你就不需要T
,只需要把它去掉。你只需要用Generic2<T2>
替换Generic1中每次出现的T
。
示例:如果Generic1当前如下所示:
public class Generic1<T, T2> where T : Generic2<T2> where T2 : new()
{
public T DoSomething() { ... }
public T2 DoSomethingElse() { ... }
}
您可以将其替换为:
public class Generic1<T2> where T2 : new()
{
public Generic2<T2> DoSomething() { ... }
public T2 DoSomethingElse() { ... }
}
Generic1现在可以简单地实例化为:
var g = new Generic1<int>();
(显然,您可以在之后将T2
重命名为T
。(