2015-05-21 1 views
3

Я кодирую интернет-приложение MVC 5, и у меня есть вопрос относительно использования interface с Lazy<T> initialization.Невозможно неявно конвертировать Lazy <Class> в Lazy <Interface>

Вот определение класса в вопросе:

public class WebAPITokenService1_0 : IWebApiTokenService 

Вот мой код, который работает с с использованием интерфейса в объявлении:

Декларация:

Lazy<WebAPITokenService1_0> webAPITokenService1_0; 

Initialization:

webAPITokenService1_0 = new Lazy<WebAPITokenService1_0>(); 

Вот тот же самый код, но с использованием интерфейса:

Декларация:

Lazy<IWebApiTokenService> webAPITokenService1_0; 

Initialization:

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, но не может видеть никакой информации о вышеуказанной ситуации.

Могу ли я использовать interface с Lazy<T> initialization, и если да, то что не соответствует моему вышеуказанному коду?

+2

'Lazy webAPITokenService1_0 = новый Lazy (() => новый WebAPITokenService1_0());' – PetSerAl

+0

Спасибо. Я согласен, что это ответ, если вы хотите опубликовать ответ. – user3736648

ответ

2

.NET поддерживает общую дисперсию только для интерфейсов и делегатов, а Lazy<T> - это класс. Таким образом, вы не можете назначить Lazy<Derived> экземпляр Lazy<Base> переменных

Однако, вы можете создать Lazy<Base> экземпляр, содержащий Derived экземпляр в качестве его собственности Value с помощью Lazy<T> конструктора, который принимает заводскую делегат в качестве аргумента:

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

Хороший ответ. У меня возникли проблемы с пониманием того, что пытался выполнить OP. –

4

Lazy<T> не поддерживает covariance, поэтому вы должны использовать точно такой же тип в декларации и инициализации.

Смежные вопросы