Редактировать: Следующее в равной степени справедливо для свойств get / set, поэтому тот факт, что вы не можете объявлять поля в интерфейсе, не является фундаментальным для пунктов, которые я делаю.
В вашем случае ITimeEvent.Handler
- это поле, что означает, что вы можете сделать следующее:
ITimeEvent x = ...;
IJobTimeEventHandler handler = ...;
x.Handler = handler;
Если x
был назначен объект (конкретного) типа JobTimeEvent
, а JobTimeEvent.Handler
был объявлен как JobTimeEventHandler
, указанное выше назначение завершилось бы неудачно. Это пример того, как контравариантность не является безопасной операцией для присваивания.
Если вместо этого у вас было следующее:
interface ITimeEvent
{
IJobTimeEventHandler Handler { get; }
}
Тогда вы могли бы легко сделать это:
class JobTimeEvent : ITimeEvent
{
private JobTimeEventHandler _handler;
public IJobTimeEventHandler Handler { get { return _handler; } }
}