Параметр типа привязки метода к интерфейсам, реализованным другим типом - PullRequest
2 голосов
/ 04 ноября 2010

Целью следующего является разрешить вызов IRegistration<Foo>.As<IFoo>, только если Foo реализует IFoo:

interface IRegistration<TImplementation>
{
   void As<TContract>() where TImplementation : TContract;
}

Это не разрешено компилятором C # 3.0.Я получаю следующую ошибку:

«SomeNamespace.IRegistration.As ()» не определяет параметр типа «TImplementation»

Есть ли способ обойти это, кромепоместить оба параметра типа в объявление метода?

Этот вопрос вдохновлен этим другим вопросом об Autofac .

1 Ответ

3 голосов
/ 04 ноября 2010

Вы пытаетесь добавить ограничение на параметр типа, который не существует в списке параметров типа.

Это то, что вы имели в виду?

interface IRegistration<TImplementation> where TImplementation : TContract
{
   void As<TContract>();
}

Хотя это не скомпилируетсялибо - у вас не может быть универсального ограничения для универсального типа.

Это скомпилирует, хотя, вероятно, не создаст нужное ограничение для самого метода:

interface IRegistration<TImplementation,TContract> where TImplementation : TContract
{
   void As<TContract>();
}

Посмотрите, еслиэто будет делать:

interface IRegistration<TImplementation,TContract> where TImplementation : TContract
{
   void As();
}

Таким образом, каждый раз, когда вы используете TImplementation, оно будет ограничено значением TContract, и вы все равно можете использовать TContract в методе As.

Вы можете найти больше информации здесь - посмотрите на раздел в конце страницы, озаглавленный «Введите параметры как ограничения».

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