无法巧妙地将类型Void转换为类型System.Collections.Generic.IList <T>

Pet*_*ter 3 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

        }
Run Code Online (Sandbox Code Playgroud)

小智 10

result = result.Add(obj);
Run Code Online (Sandbox Code Playgroud)

Add()不返回任何内容.删除"result ="


R. *_*des 8

添加方法不返回任何东西.它只是更改列表.这就是你收到错误的原因.只需删除作业:

result.Add(obj);
Run Code Online (Sandbox Code Playgroud)

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

IList<T> result = new List<T>();
Run Code Online (Sandbox Code Playgroud)

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

return result;
Run Code Online (Sandbox Code Playgroud)

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

我猜你想要的是把这些集合中的所有项目都添加到列表中.如果是这种情况,则应该转换为IEnumerable<T>,然后调用该AddRange方法.

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