я выставить следующий класс в узле А:Ошибка компиляции при переопределении универсального типа метода
public abstract class ServiceDependencyHost
{
protected virtual T ReferenceService<T>() where T : ServiceBase
{
// Virtual implementation here...
}
}
я выставить этот производный класс в отдельной сборке (B):
public sealed class ProcessServiceOperation : ServiceDependencyHost
{
public override T ReferenceService<T>()
{
// Override implementation here...
return base.ReferenceService<T>();
}
}
Использование кода как показано выше, компилятор жалуется на этой линии:
return base.ReferenceService<T>();
Тип «T» может не следует использовать как параметр типа 'T' в родовом типе или методе A.ReferenceService(). Нет конверсии бокса или преобразования параметров типа из «T» в «System.ServiceProcess.ServiceBase».
Естественно, я попытался тиражирование ограничения в сборке B:
public override T ReferenceService<T>() where T : ServiceBase
Но компилятор в настоящее время предупреждает на строке выше ...
Ограничения для переопределения и явных методов реализации интерфейса наследуются из базового метода, поэтому они не могут быть указаны напрямую.
This answer указывает, что мое решение должно было работать. Я хочу избежать использования рефлекса, чтобы публично публиковать этот метод. Это должно быть так просто!
Заранее благодарим любого, кто может определить, какую ошибку я делаю.
Смотрите мой комментарий по почте elgonzo. Спасибо, Дуглас. Интересно, почему компилятор меня заблудился: -P – AdamStone
Ах, ваше объяснение о том, почему компилятор произносит эти сообщения об ошибках. Это сводится к порядку, в котором компилятор делает проверки на здравомыслие и на котором он терпит неудачу первым ... – elgonzo