我正在编写一个MVC 5互联网应用程序,我对interface
与Lazy<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,但看不到有关上述情况的任何信息。
我可以将interface
与Lazy<T> initialization
一起使用,若然,我的上述代码有什么不对?
答案 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));