Если бы существовал интерфейс ILazy<T>
, он мог бы быть объявлен как ILazy<out T>
, и все было бы хорошо в вашем примере: T
- это , эффективно используемое только в выходной позиции.
Однако Lazy<T>
- это класс.Ковариантность / контравариантность можно указывать только для делегатов и интерфейсов, поэтому Lazy<T>
не может указать ее ковариацию.
Поэтому Lazy<Control>
несовместим с Lazy<T>
, поэтому назначение не работает.Это определенно расстраивает, учитывая, что, по крайней мере, с текущим API, было бы «безопасно», чтобы он был ковариантным, с точки зрения вызывающего.
(Если вам нужно это повсеместно, вы можете объявитьсобственный интерфейс ILazy<out T>
, а затем написать реализацию этого интерфейса для переноса Lazy<T>
. Я подозреваю, что это больше проблем, чем оно того стоит.)