我创建了一个国家档案
public class Country
{
public string Name { get; set;}
}
和国家名单
public class Countries : List<Country>
{}
现在我想将List分配给Countries类型变量
Countries countries = new List<Country>(new Country[] {new Country()});
但不幸的是,它不起作用。它说
无法将列表转换为国家/地区
原因是什么?我应该将List更改为其他内容吗?
你不能隐式地列出那个列表。
你需要给你的Countries
类一个构造函数:
public class Countries : List<Country>
{
public Countries(Country[] countries) : base(countries)
{
}
}
然后叫它:
Countries countries = new Countries(new Country[] {new Country()});
我将通过简化您的架构来回答您的问题。没有理由继承列表。有关更多details的信息,请参阅此答案。如果您想为您的国家/地区封装您的逻辑,则只需拥有国家/地区列表的属性即可。您的模型不需要扩展列表的功能。
public class Countries
{
protected IEnumerable<Country> _countries;
public Countries(IEnumerable<Country> countries)
{
this._countries = countries;
}
}
然后你可以这样初始化:
var countries = new Countries(new Country[] {new Country()});
Countries
类来自List<Country>
,意思是更具体。您不能将更通用的类分配给用于更具体的内容的引用。
Countries countries = new List<Country>(); //Won't work
String s = new object(); //Won't work
您可以指定特定于一般,例如
List<Country> countries = new Countries(); //Will work
object o = ""; //Will work
如果你有一个List<Country>
并且需要将它转换为Countries
对象,你可以通过实现一个允许你填充列表的构造函数来实现,如下所示:
public class Country
{
public string Name { get; set; }
}
public class Countries : List<Country>
{
public Countries(IEnumerable<Country> initializationData) : base(initializationData)
{
//No body. Work is done by base class constructor.
}
}
现在你可以:
List<Country> list = new List<Country>();
Countries countries = new Countries(list);
请注意,这会复制而不是强制转换列表,因此最终会对包含相同数据的两个不同对象进行两次引用。这是唯一的方法。