假设这适用:
public class Cat : Animal { }
并假设我有一个方法:
public void Feed(Animal animal) { ... }
我可以这样称呼它:
var animal = new Cat();
Feed(animal);
如果Feed
被重构为仅支持Lazy<Animal>
作为参数,我怎样才能使其正常工作?我想以某种方式传递我的var lazyAnimal = new Lazy<Cat>();
。
这显然不起作用:
var lazyAnimal = new Lazy<Cat>();
Feed(lazyAnimal);
答案 0 :(得分:12)
你不能,基本上 - 不管怎么说。 Lazy<T>
是一个类,所以不要假设泛型方差。
你可以创建自己的ILazy<out T>
界面,使用 Lazy<T>
实现,然后让Feed
取{{1}相反。实施将是微不足道的。
或者,您可以ILazy<Animal>
通用:
Feed
或者Servy关于接受public void Feed<T>(Lazy<T> animal) where T : Animal
的建议也会起作用,你可以使用Func<Animal>
的lambda表达式来调用它:
Lazy<T>
答案 1 :(得分:7)
嗯,你将无法完全按原样使用它。可能最简单的重构就是让它接受Func<Animal>
而不是Lazy
。然后你可以传入一个获取Lazy
值的lambda。 Func
对于它的返回类型是协变的。