#c_sharp #интерфейс
Есть интерфейс IHost public interface IHostwhere TAddress : IAddress where TPingResult : IPingResult { TAddress HostAddress { get; set; } TPingResult Response { get; set; } void SendRequest(); } Затем его наследует ITCPHost public interface ITCPHost: IHost { } И я реализую интерфейс ITCPHost в классе TCPHost public class TCPHost : ITCPHost { public ITCPAddress HostAddress { get; set; } public ITCPPingResult Response { get; set; } public Uri Uri { get; set; } public TCPHost(IPingResult response, IAddress address) { Response = (ITCPPingResult) response; HostAddress = (ITCPAddress) address; } public void SendRequest() { Метод что-то делает, не важно что... } Затем я использую этот класс: private static readonly Pinger.Pinger Pinger = new Pinger.Pinger(); private static readonly TCPPingResult Result = new TCPPingResult(); private static readonly TCPAddress Address = new TCPAddress("8.8.8.8",80); private static readonly TCPHost Host = new TCPHost(Result, Address); public PingHost() { Pinger.PingEvent += NewPingHandler; Pinger.Ping(Host, 1); /* === ОШИБКА === */ } В предпоследней строке кода выдает ошибку Severity Code Description Project File Line Suppression State Error CS1503 Argument 1: cannot convert from 'ProtocolPinger.Hosts.TCPHost' to 'ProtocolPinger.Hosts.IHost' ProtocolPinger D:\Projects\Visual Studio\ProtocolPinger\ProtocolPinger\Program.cs 27 Active Почему он не принимает наследника интерфейса? В чем ошибка? Сигнатура метода Ping: public void Ping(IHost host, int period)
Ответы
Ответ 1
Все дело в том, что IHostи IHost - это разные интерфейсы. Для того, чтобы первый можно было скастовать ко второму - надо сделать его ковариантным: interface IHost . Но в таком случае типы-параметры можно будет использовать только в качестве выходных (на что и намекает ключевое слово out): public interface IHost where TAddress : IAddress where TPingResult : IPingResult { TAddress HostAddress { get; } TPingResult Response { get; } void SendRequest(); } Если же вам нужны именно входные параметры, то задача решения не имеет, потому что IAddress невозможно привести к ITCPAddress в общем случае.
Комментариев нет:
Отправить комментарий