在C#中协变使用泛型Lazy类

时间:2014-01-14 15:44:03

标签: c# c#-4.0 covariance lazy-initialization

假设这适用:

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);

2 个答案:

答案 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对于它的返回类型是协变的。