how to do nested generic classes (if that's the appropriate name) in csharp

后端 未结 3 869
北恋
北恋 2020-12-17 23:38

I\'d like to create a class of the following type

public class EnumerableDisposer>

But it won\'t let m

相关标签:
3条回答
  • 2020-12-18 00:02

    you need to definie J.

    eg

    public class EnumerableDispose<T, J> : IDisposable
       where T : IEnumerable<T>
       where J : IDisposable
    

    better would be:

    public class EnumerableDispose<T> : IEnumerable<T>, IDisposable
        where T : IDisposable
    {
        public EnumerableDispose(IEnumerable<T> source)
        {
            // TODO: implement
        }
    }
    
    0 讨论(0)
  • 2020-12-18 00:03

    You need to do:

    public class EnumerableDisposer<T, J> : IDisposable 
        where T : IEnumerable<J> where J : IDisposable
    {
         // Implement...
    

    Unfortunately, in order to wrap any internal type (IEnumerable<J>, in your code), your "wrapping" class needs to have the type J defined in the generic definition. In addition, in order to add the IEnumerable<J> constraint, you need to have the other type T.

    That being said, if you want to avoid the double generic type specification, you could always rework this as follows:

    public class EnumerableDisposer<T> : IDisposable 
        where T : IDisposable
    {
         public EnumerableDisposer(IEnumerable<T> enumerable)
         { 
            // ...
    

    This forces you to construct it with an IEnumerable<T> where T is IDisposable, with a single generic type. Since you're effectively adding the IEnumerable<T> constraint via the constructor, this will function as well as the previous option. The only downside is that you need to have the generic done at construction time, but given the name, I suspect this will be fine...

    0 讨论(0)
  • 2020-12-18 00:24

    You can do this by adding an extra J type parameter:

    public class EnumerableDisposer<T, J> : IDisposable
        where T : IEnumerable<J>
        where J : IDisposable
    

    Note that these T and J parameters are independent of any parameters in the outer class, even if they have the same names.

    0 讨论(0)
提交回复
热议问题