我有以下代码:
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>
{
}
但这不能编译:(
编辑我
也许我问错了。这是一个非常精简的例子。我需要 T 是 Generic2 类型
答案 0 :(得分:2)
如果 T
总是 Generic2<T2>
,那么您不需要 T
并且可以摆脱它。您只需要将 Generic1 中出现的每个 T
替换为 Generic2<T2>
。
示例:如果 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
。)