无法将Lazy <class>隐式转换为Lazy <interface>

时间:2015-05-21 02:45:26

标签: c# interface initialization lazy-initialization

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

以下是有问题的课程定义:

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\1_0\WebService1_0Controller.cs

我查看了Lazy Initialization,但看不到有关上述情况的任何信息。

我可以将interfaceLazy<T> initialization一起使用,若然,我的上述代码有什么不对?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

.NET仅支持接口和委托的泛型差异,Lazy<T>是一个类。因此,您无法将Lazy<Derived>实例分配给Lazy<Base>变量

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

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