隐式转换泛型类

时间:2016-11-16 13:40:28

标签: c# .net

我试图完成这样的事情。

public class GreatClass<A, B>
    where A : IA
    where B : IB, new()
{
    public void Function()
    {
        var list = new List<A>();
        var obj = new B { Items = list.ToArray() };
    }
}

public interface IA
{
}

public interface IB
{
    IA[] Items { get; set; }
}

namespace Namespace1 
{
    public class A : IA {}
    public class B : IB {}
}

namespace Namespace2
{
    public class A : IA {}
    public class B : IB {}
}

所以我有两个具有相似类的名称空间,它们实现了相同的接口。我有一些逻辑,我想在两个名称空间中的类之间共享,因此使用实现已实现接口的泛型类。

但是我在&#34; list.ToArray()&#34;上得到了编译错误。声明它不能隐含地键入&#39; A []&#39;到&#39; IA []&#39;。我能做些什么让编译器理解如何处理这个问题?

使用.Cast()就像你们中的一些人一直建议给我一个运行时错误。我无法将类型IA []转换为Namespace1.A [](或Namespace2.A [])。

2 个答案:

答案 0 :(得分:1)

有几种选择,但最好的选择是强力输入B类并使其成为通用。

这是将要执行的代码。请注意,TA是您传入的A类型,因此始终允许访问强类型的成员。

public interface IB<TA> where TA : IA
{
    TA[] Items { get; set; }
}

并将GreaterClass更改为:

public class GreatClass<A, B>
    where A : IA
    where B : IB<A>, new()
{
}

答案 1 :(得分:0)

只需声明您的列表:

var list = new List<IA>();