Необходимо поместить структуру каталогов в каталог проекта. И затем нажмите значок "Show All Files" в вершине панели инструментов Solution Explorer. После этого добавленный каталог будет разоблачен. Необходимо будет тогда выбрать этот каталог, щелкнуть правой кнопкой и выбрать "Include in Project".
Нет, боюсь, вы не можете указать подобное ограничение. (Я тоже хотел этого при случае.)
Вы могли бы написать статический универсальный метод с двумя параметрами типа в неуниверсальном классе:
public delegate bool EqualityComparer<T>(T x, T y);
public class Collection
{
public static Equals<T, U>(Collection<T> first,
Collection<T> second,
EqualityComparer<U> comparer) where T : U
{
}
}
, и вы даже могли бы сделать этот вызов метод экземпляра в универсальном классе, если хотите:
// Implementing the static method:
return first.Equals(second, new EqualityComparer<T>(comparer));
где метод экземпляра коллекции будет просто:
public bool Equals(Collection<T> other, EqualityComparer<T> eq)
{
// ...
}
Здесь используется контравариантность, доступная для создания делегатов из C # 2 и далее.
Как сказал Джон, вы не можете ссылаться на T в пределах ограничения таким образом, поскольку он объявлен на уровне класса.
Если вы можете написать метод без доступа в частное состояние коллекции (или если они являются внутренними), то вы можете переписать так:
public class Collection<T>
{
...
}
public static class CollectionExtentions
{
public static bool Equals<T,U>(
this Collection<T> first,
Collection<T> other,
EqualityComparer<U> eq) where T : U
{
... // legal to use eq here on the T values with collections
}
}
Кстати, я предлагаю вам использовать Func
, а не ваш собственный именованный делегат
Если вы явно хотите, чтобы параметр типа был унаследованным от U классом, вам не нужны дженерики, а используйте U как формальный тип параметров. И тут проявляется полиморфизм! :)