как сделать вложенные универсальные классы (если это - соответствующее имя) в до-диезе

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

public class EnumerableDisposer<IEnumerable<IDisposable>>

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

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

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

Что это, я должен сделать для создания этого класса?

8
задан scott 12 July 2010 в 17:13
поделиться

3 ответа

Вам необходимо сделать:

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

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

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

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

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

15
ответ дан 5 December 2019 в 08:22
поделиться

вам нужно определить 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
    }
}
5
ответ дан 5 December 2019 в 08:22
поделиться

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

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

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

0
ответ дан 5 December 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: