Различие между универсальным аргументом, ограниченным к интерфейсу и просто использованием интерфейса

Я бы рекомендовал сделать следующее:

  $ yarn install --check-files

Флаг --check-files проверяет, были ли пакеты удалены из папки node_modules. (см. документация на пряжу ).

Если это не сработает, попробуйте:

  $ rm -rf ./node_modules/
  $ npm cache clean
  $ npm install

Затем, возможно, посмотрите, где vinyl-source-stream находится там, где и должно быть:

  $ ls ./node_modules/vinyl-source-stream

Как я » Работая в основном на Windows, я столкнулся с любой возможной ошибкой пряжи. Раньше у меня были подобные проблемы с , с этим , и это были те случаи, когда помогло просто удалить все и вызвать npm. Пряжа иногда не может понять, что зависимости отсутствуют, особенно с глотком.

12
задан Joel Coehoorn 27 February 2009 в 15:39
поделиться

5 ответов

Основное функциональное различие - то, что можно знать фактический тип объекта в общем методе. Параметр T будет содержать фактический тип, который может выгодный в определенных сценариях.

В неуниверсальном случае Вы не можете гарантировать доступ к базовому типу объекта. Большая часть типа Вы могли захватить значение. GetType (), но пользователь мог передать Пустой указатель и мешать Вам.

11
ответ дан 2 December 2019 в 06:10
поделиться

Jared упомянул некоторые моменты; другой интересный: с дженериками можно постараться не упаковывать типов значения, пока Вы в основном не касаетесь его..., таким образом, у меня мог быть a struct Foo : IMyInterface и передайте его в, и это не будет упаковано.

Различие становится более примечательным с вещами как наборы:

static void Foo(IEnumerable<IMyInterface> data) {}

по сравнению с

static void Foo<T>(IEnumerable<T> data) 
    where T : IMyInterface {}

Теперь, так как C# 3.0 не имеет ковариантности (за исключением массивов), я не могу передать a List<Bar> к лучшему, даже если Bar : IMyInterface - но я могу со вторым (неявный T = Bar).

7
ответ дан 2 December 2019 в 06:10
поделиться

Универсальная версия потребует.NET 2.0.

Но серьезно, в то время как они выглядят подобными, существуют принципиальные различия между ними. Одно различие во времени выполнения, JIT-компилятор сгенерирует код для каждого типа значения, который будет использоваться для универсальной версии. Неуниверсальная версия потребует, чтобы типы значения были упакованы, чтобы быть переданной функции.

Различие будет также иметь значение при контакте с делегатами. Подпись MyMethod<int> соответствия void MyDelegate(int x) в то время как неуниверсальная версия не подобрана.

3
ответ дан 2 December 2019 в 06:10
поделиться

Другое различие, с помощью общего метода позволяет Вам указывать несколько интерфейсов, которые должен реализовать Ваш объект:

class Dictionary<TKey,TVal>
    where TKey: IComparable, IEnumerable
    where TVal: IValue
{ ... }
3
ответ дан 2 December 2019 в 06:10
поделиться

Другой протест рассмотреть с этим сценарием является тем, что использование "где T: <%your основной интерфейс или % абстракции>" может злоупотребиться в дженериках, представляющих Ваш универсальный тип, неуниверсальный по своей природе.

IE: Помните путем изоляции общего метода для IMyInterface, изоляцию того метода только к тем типам реализация IMyInterface. Таким образом, если Вы просто приняли решение использовать IMyInterface на основе хороших принципов ООП, но у Вас есть только один (или в некоторых случаях очень небольшое количество) потенциальный тип где угодно, это будет реализовывать тот интерфейс, затем Вы победили цель использовать дженерики. При том обстоятельстве первый вариант был бы лучше.

Только используйте, "где" на Вашем универсальном типе, когда Вы собираетесь иметь более широкий диапазон типов, это на самом деле реализует IMyInterface.

0
ответ дан 2 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

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