首页 > 解决方案 > 分配给 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 变量。

标签: c#covariancecontravariance

解决方案


我知道这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 在这里很好地解释了这一点:

C# 方差问题:将 List<Derived> 分配为 List<Base>


推荐阅读