无法将 Lazy<Class> 隐式转换为 Lazy<Interface>

Cannot implicitly convert Lazy<Class> to Lazy<Interface>

我正在编写一个 MVC 5 互联网应用程序,我有一个关于使用 interfaceLazy<T> initialization 的问题。

这里是有问题的 class 定义:

public class WebAPITokenService1_0 : IWebApiTokenService

这是我的代码,它在声明中使用了接口:

声明:

Lazy<WebAPITokenService1_0> webAPITokenService1_0;

初始化:

webAPITokenService1_0 = new Lazy<WebAPITokenService1_0>();

这是相同的代码,但使用了一个接口:

声明:

Lazy<IWebApiTokenService> webAPITokenService1_0;

初始化:

webAPITokenService1_0 = new Lazy<WebAPITokenService1_0>();

这是在声明中使用 interface 时的错误:

> Cannot implicitly convert type
> 'System.Lazy<CanFindLocation.Services.AndroidWebAPI._1_0.WebAPITokenService1_0>'
> to
> 'System.Lazy<CanFindLocation.Interfaces.WebService.IWebApiTokenService>'  E:\CanFindLocation\MVC\CanFindLocation\CanFindLocation\Controllers\AndroidWebAPI_0\WebService1_0Controller.cs

我看过Lazy Initialization,但是看不到关于上述情况的任何信息。

我可以将 interfaceLazy<T> initialization 一起使用吗?如果可以,我上面的代码有什么不正确的地方?

Lazy<T>不支持covariance,所以必须在声明和初始化时使用完全相同的类型。

.NET 仅支持接口和委托的泛型变体,Lazy<T> 是 class。所以你不能将 Lazy<Derived> 实例分配给 Lazy<Base> 变量

但是,您可以使用接受工厂的 Lazy<T> 构造函数创建一个包含 Derived 实例作为其 Value 属性 的 Lazy<Base> 实例委托作为参数:

Lazy<Base> lazy1 = new Lazy<Base>(() => new Derived(args1));
Lazy<Base> lazy2 = new Lazy<Base>(() => GetDerived(args2));