我了解以下解决方案可以正常工作,但是似乎无法用于收集。如果我尝试在构造函数中将System.Collections.Generic.IList<Something>
分配给System.Collections.Generic.IList<ISomething>
,则会得到“无法将类型IList<Something>
隐式转换为IList<ISomething>
。存在显式转换(您是否需要强制转换吗?”) 。有什么建议吗?
工作代码:
public class Foo
{
public int Number { get; private set; }
public ISomething IsSomething { get; private set; }
public Foo(int number, Something concreteType)
{
Number = number;
IsSomething = concreteType;
}
}
不起作用:
public class Foo
{
public int Number { get; private set; }
public IList<ISomething> IsSomething { get; private set; }
public Foo(int number, IList<Something> concreteType)
{
Number = number;
IsSomething = concreteType; //getting error
}
}
ConvertAll似乎已解决此问题。
答案 0 :(得分:1)
正如@HimBromBeere所指出的那样,如果允许您尝试使用,则这些列表将变为不同的类型并破坏类型的安全性。您可以在这里参考JonSkeet的出色答案:Cast List<T> to List<Interface>
要使代码正常工作,您必须按照JonSkeet的回答中所述进行转换,或者也可以使用ConvertAll方法。
public class Foo
{
public int Number { get; private set; }
public IList<ISomething> IsSomething { get; private set; }
public Foo(int number, IList<Something> concreteType)
{
Number = number;
// convert here, creates a new list
IsSomething = concreteType.ConvertAll(x => (ISomething)x);
}
}