В настоящее время я работаю над реализацией размещенных самостоятельно служб WCF. Эти сервисы определяют свои контракты в общем интерфейсе с клиентом и хостом, который должен наследоваться от IWCFServiceBase
.
После того, как WCFHost
хостит интерфейс, указанный параметром типа, ограниченным IWCFServiceBase
: public class WCFHost<T> where T : WCFServiceBase, IWCFServiceBase
, клиент может подписаться на этот хост, указав интерфейс и идентификатор сервиса: public class WCFClient<T> : IDisposable where T : IWCFServiceBase
. Пока что этот функционал работает без нареканий.
Теперь я хотел попробовать отсортировать сервисы Lazy-Discover и сохранить доступный канал для каждой обнаруженной службы. Эта функциональность обеспечивается локатором, который содержит все обнаруженные сервисы в этой структуре: public Dictionary<string, Dictionary<IWCFServiceBase, WCFClient<IWCFServiceBase>>> Services;
Теперь, предполагая, что служба использовалась ранее, поэтому она уже обнаружена и сохранена в словаре. Я использую следующий код для ее получения:
public WCFClient<T> GetMicroService<T>(string servicename, T contract) where T : IWCFServiceBase
{
if (this.Services.ContainsKey(servicename) && this.Services[servicename].ContainsKey(contract))
{
return this.Services[servicename][contract];
}
}
Тип Client.WCFClient<WCFCommunication.IWCFServiceBase>
не может быть неявно преобразован в Client.WCFClient<T>
.
Очевидно, что это случай T != IWCFServiceBase
, за исключением случаев, когда принимается во внимание ограничение типа where T : IWCFServiceBase
.
Так почему же C # не делает этого и что я не так понял? Я чувствую, что в том, как я пытаюсь использовать дженерики, должна быть большая ошибка.