错误:无法将类型“void”隐式转换为“System.Collections.Generic.List”

21

我想从一个包含该控件的.aspx文件中设置我的.ascx控件的属性。

因此,在其中一个包含此控件的.aspx中,我使用以下代码尝试设置嵌入的.ascx的ItemsList属性:

Item item = GetItem(itemID);
myUsercontrol.ItemList = new List<Item>().Add(item);

我正在尝试设置.ascx中的属性,它看起来像这样:

public List<Item> ItemsList
{
   get { return this.itemsList; }
   set { this.itemsList = value; }
}

错误: 无法隐式转换类型“void”为“System.Collections.Generic.List”。

所以我不知道它怎么会把void作为属性的一部分?...奇怪。

7个回答

48

你不能这样做,因为Add函数返回的是void类型,而不是列表的引用。你可以这样做:

mycontrol.ItemList = new List<Item>();
mycontrol.ItemList.Add(item);

或者使用 集合初始化器

mycontrol.ItemList = new List<Item> { item };

我使用new关键字创建了一个新的列表实例,为什么Add方法会涉及返回我已经指定的NEW实例呢?我只是在向列表数组中添加内容。 - PositiveGuy
@cofffeeaddict:您正在尝试设置一个期望列表实例的属性。Add方法是void类型。 - shahkalpesh
我给它一个实例...使用新关键字new List<Item>。 - PositiveGuy
我认为我这样做的方式是新的,创建了一个新实例,然后简单地添加一个add,将项目添加到List<Item>的新实例中。 - PositiveGuy
@coffeeaddict:你期望一种流畅的接口,但 List<T>.Add 并不是这种情况。 - shahkalpesh

2
ItemListt.ItemList = new List<Item>().Add(item);

Add 方法是否返回基于列表的类的实例?

编辑:不是,参见此 链接 以获取关于 List<T>.Add 的文档。

编辑2:尝试编写此代码片段并查看 Add 方法的返回值。

List<Item> items = new List<Item>();
var modifiedList = items.Add(myItem);

你会发现,代码应该在 Add 处失败,因为它返回了 void

@coffeeaddict:我刷新了页面好几次,但是代码没有任何变化。问题仍然在于你使用了返回void的Add方法。请改用集合初始化器,例如new List<Item>() {item};(希望这个语法是正确的)。 - shahkalpesh

1
创建了 List<Item> 之后,您立即对其调用 Add 方法,该方法返回 void 类型。这无法转换为 ItemList.ItemList 的类型。
您应该改为这样做:
var list = new List<Item>();
list.Add(item);
ItemList.ItemList = list;

1
new List<Item>().Add(item);

这行代码返回空值。

尝试:

var list = new List<Item>();
list.Add(item);
ItemListt.ItemList = list;

0

Add方法不会返回列表的引用。您需要分两步完成此操作:

ItemListt.ItemList = new List<Item>();
ItemListt.ItemList.Add(item);

或者使用一个本地变量来保存引用,然后将其放入属性中:

List<Item> list = new List<Item>();
list.Add(item);
ItemListt.ItemList = list;

0
只要在您的用户控件上实例化了 ItemList,您就可以执行 UserControl.ItemList.Add(item)

为什么ItemList需要在我已经实例化它的地方之外再次实例化。我已经在那里使用了new关键字,它已经是一个实例了! - PositiveGuy
正确,但是List<T>.Add()方法有一个void返回类型,所以你不能将它分配给mycontrol.ItemList()。你必须要么在另一行上单独实例化它,要么使用集合初始化器。 如果你已经执行了实例化操作,那么我的答案就适用。 - Scott Arrington

0

对于那些通过谷歌搜索错误而来的人:

有时候是因为你没有完成一行代码,但它仍然可以编译,错误只会在下一行显示出来,如果你不注意就会感到困惑/误导。例如:

var foo = 33;
var bar = 

// Note that I never finished the assignation (got distracted, saved and it compiled)
//
// Some unrelated code returning "void" (another example would be List.Add)
await SomethingAsync(); // -> Error shows up here instead

可能会为你们中的一些人节省一些头痛,试图弄清楚为什么“等待我的函数”会引发“无法将void转换为X”的问题,而实际上这并不是真正的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接