将列表强制转换为国家:List <country>

时间:2018-08-31 17:52:14

标签: c# casting compiler-errors

我创建了国家(地区)资料

public class Country
{
   public string Name { get; set;}
}

和国家/地区列表

public class Countries : List<Country>
{}

现在我想将“列表”分配给“国家/地区”类型变量

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

,但是不幸的是它不起作用。它说

  

无法将列表转换为国家/地区

原因是什么?我应该将List更改为其他名称吗?

3 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

您不能隐式转换列表。

您需要为您的Countries类提供一个构造函数:

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

然后调用它:

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

答案 2 :(得分: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()});