2015-05-21 58 views
3

我正在编写一个MVC 5互联网应用程序,我有一个关于使用interfaceLazy<T> initialization的问题。不能隐含地将懒惰<Class>转换为懒惰<Interface>

这里是有问题的类定义:

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

'Lazy webAPITokenService1_0 = new Lazy (()=> new WebAPITokenService1_0());' – PetSerAl

+0

谢谢。如果您想发布答案,我会接受这个答案。 – user3736648

回答

2

.NET仅支持接口和代表的通用方差,而Lazy<T>是一类。所以你不能Lazy<Derived>实例分配给Lazy<Base>可变

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

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

很好的答案。我很难理解OP想要完成什么。 –

4

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