将列表列为国家:列表

问题描述 投票:1回答:3

我创建了一个国家档案

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更改为其他内容吗?

c# casting compiler-errors
3个回答
1
投票

你不能隐式地列出那个列表。

你需要给你的Countries类一个构造函数:

public class Countries : List<Country>
{
    public Countries(Country[] countries) : base(countries)
    {
    }
}

然后叫它:

Countries countries = new Countries(new Country[] {new Country()});

1
投票

我将通过简化您的架构来回答您的问题。没有理由继承列表。有关更多details的信息,请参阅此答案。如果您想为您的国家/地区封装您的逻辑,则只需拥有国家/地区列表的属性即可。您的模型不需要扩展列表的功能。

public class Countries
{
    protected IEnumerable<Country> _countries;
    public Countries(IEnumerable<Country> countries)
    {
        this._countries = countries;
    }
}

然后你可以这样初始化:

var countries = new Countries(new Country[] {new Country()});

1
投票

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);

请注意,这会复制而不是强制转换列表,因此最终会对包含相同数据的两个不同对象进行两次引用。这是唯一的方法。

© www.soinside.com 2019 - 2024. All rights reserved.