Я хотел бы создать класс следующего типа
public class EnumerableDisposer<IEnumerable<IDisposable>>
Но это не позволит мне объявить это этот путь. Я также попробовал:
public class EnumerableDisposer<T> : IDisposable where T : IEnumerable<J> where J : IDisposable
Но компилятор говорит мне, что тип/пространство имен J не мог быть найден.
Что это, я должен сделать для создания этого класса?
Вам необходимо сделать:
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
через конструктор, он будет работать так же, как и предыдущий вариант. Единственным недостатком является то, что вам нужно сделать общий шаблон во время строительства, но, учитывая имя, я подозреваю, что это будет нормально ...
вам нужно определить 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
}
}
Вы можете сделать это, добавив дополнительный J
параметр типа:
public class EnumerableDisposer<T, J> : IDisposable
where T : IEnumerable<J>
where J : IDisposable
Обратите внимание, что эти T
и J
параметры не зависят от любых параметров во внешнем классе, даже если они имеют одинаковые имена.