c# - 分配给 Lazy<> 时的反/协方差问题
问题描述
private void AMethod<T>() where T : Control, new()
{
Lazy<T> lazyControl = new Lazy<T>(() => new T());
Lazy<Control> a = lazyControl;
}
我在最后一行收到以下错误。
Argument 2: cannot convert from 'System.Lazy<T>' to
'System.Lazy<System.Windows.Forms.Control>'
我知道 T 可能是更具体的类型,但我不明白为什么我不能将它分配给 Lazy 变量。
解决方案
我知道这
T
可能是一个更具体的类型,但我不明白为什么我不能将它分配给 Lazy 变量。
ALazy<T>
与 a 没有关系Lazy<Control>
,就像 aLazy<Base>
与 有任何关系一样Lazy<Derived>
。
仅仅因为Derived
派生自Base
并且您可以这样做:
Base b = new Derived();
...这并不意味着您可以这样做:
Lazy<Base> b = new Lazy<Derived>();
该类型Lazy<Derived>
并非派生自Lazy<Base>
. @Jon Skeet 在这里很好地解释了这一点:
推荐阅读
- memory - Lua / Coroutines 如何测量标准函数占用多少内存
- ios - 在 Firebase 远程配置中设置最小间隔和设置 fetch withExpirationDuration 有什么区别?
- vue.js - 在 Vue v-if 中,如何检查对象数组中的对象是否具有指定键的特定值?
- amazon-web-services - AWS CDK 引导堆栈的用途和范围?
- php - AJAX 使用 if 条件重新加载数据
- javascript - 使用 axios 和 node js 同步调用
- r - 是否有另一种方法可以在 R 中不使用 for 循环来编写以下函数?
- r - 如何在 R 中将 Betafix 与 Coxphw 包一起使用?
- r - 读取数据框中的值并将其存储在向量中
- c++ - '||' 之前的预期主表达式