实现一个具有需要泛型约束的泛型类

时间:2021-05-03 14:40:01

标签: c# generics

我有以下代码:

 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 类型

1 个答案:

答案 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。)