как сделать вложенные общие классы (если это подходящее имя) в csharp - PullRequest
7 голосов
/ 12 июля 2010

Я хотел бы создать класс следующего типа

public class EnumerableDisposer<IEnumerable<IDisposable>>

Но это не позволит мне объявить это таким образом. Я также попробовал:

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

Но компилятор говорит мне, что тип / пространство имен J не может быть найдено.

Что мне нужно сделать, чтобы создать этот класс?

Ответы [ 3 ]

14 голосов
/ 12 июля 2010

Вам нужно сделать:

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

К сожалению, для того, чтобы обернуть любой внутренний тип (IEnumerable<J>, в вашем коде), вашему классу "обёртывания" должен быть определён тип Jв общем определении.Кроме того, чтобы добавить ограничение IEnumerable<J>, вам нужно иметь другой тип T.

При этом, если вы хотите избежать спецификации двойного универсального типа, вы всегда можете переделать этоследующим образом:

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

Это вынуждает вас создавать его с IEnumerable<T>, где T - IDisposable, с единственным универсальным типом.Поскольку вы эффективно добавляете ограничение IEnumerable<T> через конструктор, это будет работать так же, как и предыдущий параметр.Единственным недостатком является то, что вам нужно сделать общий во время строительства, но, учитывая имя, я подозреваю, что это будет хорошо ...

5 голосов
/ 12 июля 2010

вам нужно определить J.

например

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

лучше будет:

public class EnumerableDispose<T> : IEnumerable<T>, IDisposable
    where T : IDisposable
{
    public EnumerableDispose(IEnumerable<T> source)
    {
        // TODO: implement
    }
}
0 голосов
/ 12 июля 2010

Это можно сделать, добавив дополнительный параметр типа J:

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

Обратите внимание, что эти параметры T и J не зависят от каких-либо параметров внешнего класса, даже если ониимеют одинаковые имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...