无法将类型void隐式转换为IList <int> </int>

时间:2009-10-07 00:33:52

标签: c# oop

 string categoryIDList = Convert.ToString(reader["categoryIDList"]);

    if (!String.IsNullOrEmpty(categoryIDList))
    {
        c.CategoryIDList  =
            new List<int>().AddRange(
                categoryIDList 
                    .Split(',')
                    .Select(s => Convert.ToInt32(s)));

    }

该类有一个属性IList CategoryIDList,我试图将其分配给上面。

错误:

错误1无法将类型'void'隐式转换为'System.Collections.Generic.IList'

不确定是什么问题?

5 个答案:

答案 0 :(得分:5)

您的问题是AddRange method of the generic List class被声明为返回无效。

更新:已修改以修复List<int>IList<int>问题。

您需要将其更改为:

List<int> foo = new List<int>();
foo.AddRange(
    categoryIDList 
    .Split(',')
    .Select(s => Convert.ToInt32(s)));
c.CategoryIDList = foo;

答案 1 :(得分:3)

为什么不使用select查询的结果初始化列表而不是使用AddRange,因为它将IEnumerable作为重载:

c.CategoryIDList = new List<int>(categoryIDList.Split(',')
 .Select(s => Convert.ToInt32(s)));

答案 2 :(得分:2)

AddRange不返回列表 - 它返回void。您可以通过List<T> that takes an enumerable的构造函数执行此操作:

string categoryIDList = Convert.ToString(reader["categoryIDList"]);

if (!String.IsNullOrEmpty(categoryIDList))
{
    c.CategoryIDList  =
        new List<int>(
            categoryIDList.Split(',').Select(s => Convert.ToInt32(s))
        );
}

答案 3 :(得分:1)

为了更好地了解正在发生的事情,我在下面创建了示例。 解决方案应基于1. list.AddRange,2。然后将列表重新分配给其他内容:

List<int> list1 = new List<int>{1,4, 8};
List<int> list2 = new List<int> { 9, 3, 1 };
//this will cause compiler error "AddRange cannot convert source type void to target type List<>"
//List<int> list3 = list1.AddRange(list2); 
//do something like this:
List<int> list3 = new List<int>();
list3.AddRange(list1);
list3.AddRange(list2);

答案 4 :(得分:0)

您将AddRange的结果分配给c.CategoryIDList,而不是新列表本身。