如何在csharp中做嵌套泛型类(如果这是合适的名称)

sco*_*ott 8 c# generics class

我想创建一个以下类型的类

public class EnumerableDisposer<IEnumerable<IDisposable>>
Run Code Online (Sandbox Code Playgroud)

但它不会让我以这种方式宣布它.我也尝试过:

public class EnumerableDisposer<T> : IDisposable where T : IEnumerable<J> where J : IDisposable
Run Code Online (Sandbox Code Playgroud)

但是编译器告诉我无法找到类型/命名空间J.

创建这个课我需要做什么?

Ree*_*sey 15

你需要这样做:

public class EnumerableDisposer<T, J> : IDisposable 
    where T : IEnumerable<J> where J : IDisposable
{
     // Implement...
Run Code Online (Sandbox Code Playgroud)

不幸的是,为了包装任何内部类型(IEnumerable<J>在您的代码中),您的"包装"类需要具有J通用定义中定义的类型.另外,为了添加IEnumerable<J>约束,您需要具有其他类型T.

话虽这么说,如果你想避免双泛型类型规范,你总是可以按如下方式重做:

public class EnumerableDisposer<T> : IDisposable 
    where T : IDisposable
{
     public EnumerableDisposer(IEnumerable<T> enumerable)
     { 
        // ...
Run Code Online (Sandbox Code Playgroud)

这会强制您构造它,IEnumerable<T>其中T是IDisposable,具有单个泛型类型.由于您IEnumerable<T>通过构造函数有效地添加了约束,因此它将与前一个选项一样有效.唯一的缺点是你需要在施工时完成通用,但鉴于名称,我怀疑这将是好的...


And*_*air 5

你需要定义J.

例如

public class EnumerableDispose<T, J> : IDisposable
   where T : IEnumerable<T>
   where J : IDisposable
Run Code Online (Sandbox Code Playgroud)

更好的是:

public class EnumerableDispose<T> : IEnumerable<T>, IDisposable
    where T : IDisposable
{
    public EnumerableDispose(IEnumerable<T> source)
    {
        // TODO: implement
    }
}
Run Code Online (Sandbox Code Playgroud)