我试图完成这样的事情。
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 [])。
答案 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>();