在C#中协变使用genericsLazy类

假设这适用:

public class Cat : Animal { } 

并假设我有一个方法:

 public void Feed(Animal animal) { ... } 

我可以这样称呼它:

 var animal = new Cat(); Feed(animal); 

Feed被重构为仅支持Lazy作为参数时,如何才能使其正常工作? 我想传入我的var lazyAnimal = new Lazy(); 不知何故。

这显然不起作用:

 var lazyAnimal = new Lazy(); Feed(lazyAnimal); 

好吧,你将无法完全按原样使用它。 可能最简单的重构就是让它接受一个Func而不是一个Lazy 。 然后你可以传入一个获取Lazy值的lambda。 Func对于它的返回类型是协变的。

你不能,基本上 – 不管是直接的。 Lazy是一个类,所以不要假设generics方差。

可以创建自己的ILazy界面, 使用 Lazy实现它,然后使Feed改为使用ILazy 。 实施将是微不足道的。

或者,您可以使Feed通用:

 public void Feed(Lazy animal) where T : Animal 

或者Servy关于服用Func的建议也会起作用,你可以使用lambda表达式为Lazy调用它:

 Feed(() => lazyAnimal.Value);