【问题标题】:Cannot implicitly convert Lazy<Class> to Lazy<Interface>无法将 Lazy<Class> 隐式转换为 Lazy<Interface>
【发布时间】:2015-05-21 02:45:26
【问题描述】:

我正在编写一个 MVC 5 互联网应用程序,我有一个关于使用 interfaceLazy&lt;T&gt; 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&lt;T&gt; initialization 一起使用吗?如果可以,我上面的代码有什么问题?

【问题讨论】:

  • Lazy&lt;IWebApiTokenService&gt; webAPITokenService1_0=new Lazy&lt;IWebApiTokenService&gt;(() =&gt; new WebAPITokenService1_0());
  • 谢谢。如果您想发布答案,我会接受这是答案。

标签: c# interface initialization lazy-initialization


【解决方案1】:

Lazy&lt;T&gt;不支持covariance,所以在声明和初始化时必须使用完全相同的类型。

【讨论】:

    【解决方案2】:

    .NET 仅支持接口和委托的泛型变化,Lazy&lt;T&gt; 是一个类。所以你不能将Lazy&lt;Derived&gt; 实例分配给Lazy&lt;Base&gt; 变量

    但是,您可以使用接受工厂委托作为参数的Lazy&lt;T&gt; 构造函数来创建一个包含Derived 实例作为其Value 属性的Lazy&lt;Base&gt; 实例:

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

    【讨论】:

    • 好答案。我无法理解 OP 试图完成的任务。
    猜你喜欢
    • 2016-11-17
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多