2015-05-21 55 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,所以你必須在聲明和初始化使用完全相同的類型。