无法隐式转换类型Void以键入System.Collections.Generic.IList <t> </t>

时间:2011-02-02 16:01:45

标签: c# generics

尝试返回泛型类型并收到标题中描述的错误。 我确信我正在做一些愚蠢的事情 - 建议赞赏......

public static IList<T> GetGroupById<T>(int groupId)
        {

            DashboardGroupType type = (DashboardGroupType)groupId;
            IList<T> result = null;

            var obj = default(T);

            switch (type)
            {
                case DashboardGroupType.Countries:
                    break;
                case DashboardGroupType.Customers:
                    // this returns a list of typ  IEnumerable<Customer>
                    obj = (T) CustomerRepository.GetAllCustomers();
                    break;
                case DashboardGroupType.Facilities:
                    // this returns a list of typ  IEnumerable<Facility>
                    obj = (T) FacilityRepository.GetAllFacilities();
                    break;
                case DashboardGroupType.Heiarchy:
                    break;
                case DashboardGroupType.Lines:
                    break;
                case DashboardGroupType.Regions:
                    // this returns a list of typ  IEnumerable<string>
                    obj = (T) CustomerRepository.GetRegionsHavingCustomers();
                    break;
                case DashboardGroupType.States:
                    // // this returns a list of typ  IEnumerable<Customer>
                    obj = (T) CustomerRepository.GetStatesHavingCustomers();
                    break;
                case DashboardGroupType.Tanks:
                    break;
                default:
                    break;
            }

            result = result.Add(obj); // ERROR IS THROWN HERE

        }

6 个答案:

答案 0 :(得分:10)

result = result.Add(obj);

Add()不会返回任何内容。 删除“result =”

答案 1 :(得分:8)

Add方法不会返回任何内容。它只是更改列表。这就是你收到错误的原因。只需删除作业:

result.Add(obj);

另一个问题是你没有初始化结果。运行代码时,您将收到NullReferenceException。你需要这样的东西:

IList<T> result = new List<T>();

您还需要从此函数返回一个值。我猜你想要

return result;

根据您的评论,方法CustomerRepository.GetAllCustomers();FacilityRepository.GetAllFacilities();等方法会返回IEnumerable<Customer>IEnumerable<Facility>或类似内容的实例。您将这些转换为T.这意味着所有这些类型都必须可转换为T。

我猜你想要的是拿走这些集合中的所有项目并将它们添加到列表中。如果是这种情况,则应转换为IEnumerable<T>,并调用AddRange方法。

总的来说,这似乎是一个非常糟糕的设计。根据您要实现的目标,可以使用继承和/或接口来获得更好的设计。

答案 2 :(得分:4)

你的方法说它将返回IList,但你没有返回任何东西(因此,返回void)。如果我没弄错的话,你应该返回结果。

修改

实际上,经过进一步审核,我发现问题是result.Add返回void,而行

result = result.Add(obj);正在尝试将其分配给结果(即List)。这就是为什么这行有错误,你还需要返回结果并在向它添加任何内容之前对其进行实例化。

答案 3 :(得分:3)

为什么要分配结果

result = result.Add(obj);

如果您使用

,这将正常工作
result.Add(obj);

,最后一行为return result;

答案 4 :(得分:1)

两件事:你应该在结尾处返回结果,并且在开始时声明结果时,你应该将它声明为新的List而不是null。

答案 5 :(得分:1)

您缺少return语句。

return result;