[英]Cannot implicitly convert type void to List
我有下面的类结构:
class Child
{
public List<ParentData> ParentData { get; set; }
}
class ParentData
{
public string FatherName {get;set;}
public string MotherName {get;set;}
public List<GrandParentData> GrandParentData{ get; set; }
}
class GrandParentData
{
public string GrandFatherName {get;set;}
public string GrandMotherName {get;set;}
}
当我尝试填写此内容时:
foreach (var item in res)
{
obj.StoryData.Add(
new StoryData
{
FatherName = item.FatherName,
MotherName = item.Description,
GrandParentData = new List<GrandParentData().Add(
new GrandParentData
{
GrandFatherName = "",
GrandMotherName = ""
}
);
}
);
}
当我尝试将数据添加到GrandParentList列表时,这给了我错误:
无法将类型void隐式转换为List
我需要更改班级结构吗? 我应该对代码进行哪些编辑?
所以这是问题所在:
GrandParentData=new List<GrandParentData().Add(
new GrandParentData { GrandFatherName = "",GrandMotherName =""});
这里有三个问题:
Add
方法,该方法返回void
因此出现编译时错误 作为最后一部分的进一步说明,忽略您在对象初始化器中的事实,您的代码等效于尝试编写类似以下内容的代码:
List<int> list = new List<int>().Add(1);
这是无效的,因为new List<int>().Add(1)
不返回任何内容。 要显式使用Add
,您需要分别声明变量:
List<int> list = new List<int>();
list.Add(1);
当然,这在对象初始化器中是行不通的,因为您需要提供一个表达式来设置属性。
解决方案是改用集合初始化器 。 在我们的简单情况下,将是:
List<int> list = new List<int> { 1 };
在更复杂的情况下,您可以这样做:
GrandParentData = new List<GrandParentData>
{
new GrandParentData { GrandFatherName = "", GrandMotherName = "" }
}
另外,您可以将GrandParentData
更改为只读属性,但已将其初始化,如下所示:
public List<GrandParentData> GrandParentData { get; } =
new List<GrandParentData>();
然后,您可以编写:
GrandParentData =
{
new GrandParentData { GrandFatherName = "", GrandMotherName = "" }
}
...,新的GrandParentData
将添加到现有集合中。
您不能创建新列表,然后以这种方式(分配值)在其上调用Add
代替:
GrandParentData = new List<GrandParentData>().Add(...)
写(使用集合初始化器语法):
GrandParentData = new List<GrandParentData> { new GrandParentData { ... } }
发生特定错误的原因是Add
是一个无效方法,因此,当您尝试将结果分配给属性时,会出现错误。
检查以下代码,看看第一行还可以,但是第二行给出了错误:
new List<string>().Add("text");
var list = new List<string>().Add("text");
尽管第一行实际上可以工作并且不会产生错误,但是由于您没有对该集合的引用,因此现在已经可以理解,并且初始化列表将由GC收集
您试图将Add
方法的结果( void
)分配给变量。 这是不可能的。 不能将void
分配给变量。
收集初始值设定项以进行救援:
GrandParentData = new List<GrandParentData()
{ new GrandParentData { GrandFatherName = "",GrandMotherName =""}
}
发出源是这段代码:
GrandParentData=new List<GrandParentData().Add(
new GrandParentData { GrandFatherName = "",GrandMotherName =""}
为什么呢
GrandParentData
的类型为List<GrandParentData>
和List<GrandParentData>.Add
方法返回void,因此它只是说您不能将List<GrandParentData>
映射为void return,这是公平的。 以下是List<T>.Add
的实现。
public void Add(T item) {
if (_size == _items.Length) EnsureCapacity(_size + 1);
_items[_size++] = item;
_version++;
}
在这里检查
解决方案是:
如以上其他答案中列出的那样,您在列表创建过程中进行对象添加,实际上,您可以简单地执行以下操作:
GrandParentData = new List<GrandParentData() { new GrandParentData()}
并在构造函数中分配默认值,如下所示:
class GrandParentData
{
public string GrandFatherName {get;set;}
public string GrandMotherName {get;set;}
public GrandParentData()
{
GrandFatherName = "";
GrandMotherName = "";
}
}
另一方面,与模型设计有关的另一个令人惊讶的地方是,有一个名为GrandParentData
的模型,您有一个public List<GrandParentData> GrandParentData{ get; set; }
public List<GrandParentData> GrandParentData{ get; set; }
public List<GrandParentData> GrandParentData{ get; set; }
,这通常是令人困惑的,理想情况下使用后缀来表明它是一个集合
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.