2016-11-16 184 views
-1

我试图完成这样的事情。隐式转换泛型类

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 {} 
} 

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

但是,我在“list.ToArray()”上得到一个编译错误,指出它不能隐式输入'IA []'到'IA []'。有什么我可以做的,这使得编译器明白如何处理这个问题?

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

+0

你可以用'.Cast ()'虽然因为数组是空的,你可以只创建一个空的'IA []'直接。 – Lee

回答

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() 
{ 
} 
0

简单地声明您的列表如下:

var list = new List<IA>(); 
+1

解释会好吗?这是一个很好的方法,但如果它符合OP为什么具有该数据结构(这从 – Liam

+0

这个问题不清楚),我认为如果他可以控制“cast”方法是正确的方式实现。数组协变适用于引用类型和继承层次结构。 – mtheriault

+0

我认为这不是一个好的方法,因为每次你想把一个项目从列表中展示给课堂外部时,你必须进行投射。 –