c# - C# 中泛型 Lazy 类的协变使用

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

最佳答案

你不能,基本上 - 无论如何不能直接。 Lazy<T>是一个类,所以不假设泛型方差。

可以创建自己的ILazy<out T>接口(interface),使用实现它 Lazy<T> , 然后制作 FeedILazy<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/

相关文章:

c# - 我可以通过 C++/CLI 包装器将 C# 数组传递给 C 指针吗?

c# - 井字游戏递归算法

Kotlin 类层次结构和(协)方差

r - 在 R 中计算向量值 Hessian

c# - 查看/收集 OnPrem Service Fabric ETW 事件

c# - 按属性值创建实体搜索

asp.net - 如何让服务从 global.asax 启动而无需调用它?

entity-framework - EF - 为什么不包括对属性的工作

c# - 合并两个列表和一个字典以创建一个字典

c# - 为什么 ReadOnlyCollection 不允许协方差?