Потому что вы не можете. Дженерики - это не шаблоны. Вы не должны думать о них, как шаблоны C ++, и ожидать такого же поведения.
Спецификация C # явно запрещает использование параметров типа в качестве базового класса:
C # 3.0 Спецификация языка: параметры типа (§4.5)
Параметр типа не может использоваться напрямую для объявления базового класса (§10.2.4) или интерфейса (§13.1.3).
blockquote>Обновление:
Я понимаю, что вы хотите сделать и его использование. Это традиционный пример использования шаблонов C ++. В частности, если это было возможно сделать с использованием генераторов C #, такие вещи, как
Moq
library , могли бы быть полезны. Проблема в том, что C ++-шаблоны - это время компиляции «find and replace», в то время как C # generics - это время выполнения.Чтобы продемонстрировать этот факт, для этого класса:
class Test
where T : class { // whatever contents it might have... } только один ИЛ будет выпущен во время компиляции и во время выполнения, компилятор JIT будет генерировать единый собственный код для всех типов типа ссылочного типа. Это совсем не похоже на C ++-шаблоны, где собственный код будет испускаться для каждого
T
отдельно (он подвержен оптимизации, но концептуально, они являются полностью отдельными фрагментами кода).
Этот ответ может быть тривиальным / очевидным, но вы можете просто пойти дальше и выполнить слияние:
# from your target branch
git merge feature
Если вы столкнулись с некоторыми неприятными конфликтами слияния и хотите выручить, просто используйте: [114 ]
git merge --abort
Если объединение действительно завершается без конфликтов, но вы не хотите его сохранять, вы можете сбросить его:
git reset --hard HEAD~1
Примечание. Этот ответ предполагает, что вы делать все это локально, а не на удаленном сервере Git. Если вы используете что-то вроде Bitbucket или GitHub, то уже должна быть функция, которая делает примерно то, что вы хотите. Вы можете создать запрос на извлечение, и в случае непроходимых конфликтов слияния пользовательский интерфейс предупредит вас об этом.