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