Я могу указать отношение 'супертипа' в универсальных ограничениях C#?

Необходимо поместить структуру каталогов в каталог проекта. И затем нажмите значок "Show All Files" в вершине панели инструментов Solution Explorer. После этого добавленный каталог будет разоблачен. Необходимо будет тогда выбрать этот каталог, щелкнуть правой кнопкой и выбрать "Include in Project".

enter image description here

enter image description here

6
задан thecoop 27 July 2009 в 14:09
поделиться

3 ответа

Нет, боюсь, вы не можете указать подобное ограничение. (Я тоже хотел этого при случае.)

Вы могли бы написать статический универсальный метод с двумя параметрами типа в неуниверсальном классе:

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 и далее.

4
ответ дан 17 December 2019 в 04:50
поделиться

Как сказал Джон, вы не можете ссылаться на 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 , а не ваш собственный именованный делегат

1
ответ дан 17 December 2019 в 04:50
поделиться

Если вы явно хотите, чтобы параметр типа был унаследованным от U классом, вам не нужны дженерики, а используйте U как формальный тип параметров. И тут проявляется полиморфизм! :)

0
ответ дан 17 December 2019 в 04:50
поделиться
Другие вопросы по тегам:

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