假设这适用:
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);
最佳答案
你不能,基本上 - 无论如何不能直接。 Lazy<T>
是一个类,所以不假设泛型方差。
您可以创建自己的ILazy<out T>
接口(interface),使用实现它 Lazy<T>
, 然后制作 Feed
拿ILazy<Animal>
反而。实现将是微不足道的。
或者,您可以制作 Feed
通用:
public void Feed<T>(Lazy<T> animal) where T : Animal
或者Servy的建议采取Func<Animal>
也可以,您可以使用 Lazy<T>
的 lambda 表达式来调用它:
Feed(() => lazyAnimal.Value);
关于c# - C# 中泛型 Lazy 类的协变使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117619/