Можно ли диктовать, что параметр типа C # должен быть только типом интерфейса? - PullRequest
7 голосов
/ 11 октября 2010

Я хотел бы реализовать универсальный класс C #, который выглядит примерно следующим образом:

abstract class Foobar<T> : AbstractBase, T
{ ... }

Это терпит неудачу, потому что C # будет разрешать только типы после базового класса быть интерфейсами, поэтому далее я попробую это:1004 *

abstract class Foobar<T> : AbstractBase, T where T : interface
{ ... }

Но потом я обнаружил, что C # не допускает эту форму ограничения типа.Допускаются только where T : struct и where T : class.

Как я могу указать, что параметр типа должен быть только типом интерфейса?

Ответы [ 5 ]

6 голосов
/ 11 октября 2010

В принципе, вы не можете.

Вы можете установить ограничение на определенный интерфейс, но не общее для всех интерфейсов. Таким образом, вы можете ограничиться IEnumerable, например, но не любой интерфейс.

Зачем тебе это нужно?

4 голосов
/ 11 октября 2010

Реальная проблема с этим кодом в том, что вы наследуете от параметра типа.

Попытка скомпилировать

abstract class Foobar<T> : T { ... }

по-прежнему будет с ошибкой: ошибка CS0689: Невозможно получить из 'T', поскольку это параметр типа.

Я думаю, что это было бы совершенно разумно, по крайней мере, в случае абстрактных классов, и я тоже хотел эту функцию, но компилятор c # просто не позволит вам сделать это.

1 голос
/ 11 октября 2010

Я считаю, что вы неправильно понимаете значение where T : struct и where T : class.

Общее ограничение типа , подобное этому, означает, что T должно иметь тип значения или тип ссылки соответственно.

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

Поэтому ограничение типа where T : interface не имеет смысла.

Если вы хотите узнать больше, я бы посоветовал вам прочитать Руководство по программированию в C # по ограничениям типа:

Ограничения на параметры типа (Руководство по программированию в C #)

1 голос
/ 11 октября 2010

Нельзя простыми словами.

0 голосов
/ 11 октября 2010

Это терпит неудачу, потому что C # будет разрешать только типы после базового класса быть интерфейсами

Это ограничение связано с отсутствием множественного наследования в C #.Множественное наследование может быть аппроксимировано использованием интерфейсов, поскольку переопределяющие методы являются явными.Точно так же класс может расширять только один другой класс, но может реализовывать несколько интерфейсов.Хитрость в том, что реализующий класс ДОЛЖЕН определять тело метода, чтобы реализация определяла, какой метод вызывается.

Использование ограничения по T для одного класса или нескольких интерфейсов,Вы не можете ограничить диапазон несколькими классами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...