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

尝试返回generics类型并获得标题中描述的错误。 我确信我做的事情很傻 – 建议赞赏……

public static IList GetGroupById(int groupId) { DashboardGroupType type = (DashboardGroupType)groupId; IList result = null; var obj = default(T); switch (type) { case DashboardGroupType.Countries: break; case DashboardGroupType.Customers: // this returns a list of typ IEnumerable obj = (T) CustomerRepository.GetAllCustomers(); break; case DashboardGroupType.Facilities: // this returns a list of typ IEnumerable obj = (T) FacilityRepository.GetAllFacilities(); break; case DashboardGroupType.Heiarchy: break; case DashboardGroupType.Lines: break; case DashboardGroupType.Regions: // this returns a list of typ IEnumerable obj = (T) CustomerRepository.GetRegionsHavingCustomers(); break; case DashboardGroupType.States: // // this returns a list of typ IEnumerable obj = (T) CustomerRepository.GetStatesHavingCustomers(); break; case DashboardGroupType.Tanks: break; default: break; } result = result.Add(obj); // ERROR IS THROWN HERE } 

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

 result.Add(obj); 

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

 IList result = new List(); 

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

 return result; 

根据您的意见,方法CustomerRepository.GetAllCustomers();FacilityRepository.GetAllFacilities(); 并且喜欢返回IEnumerableIEnumerable或类似的实例。 你将这些转换为T.这意味着所有这些类型都必须可以转换为T.

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

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

 result = result.Add(obj); 

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

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

编辑:

实际上,经过进一步审查,我意识到问题是结果result.Add返回void和行

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

你为什么要分配结果

result = result.Add(obj);

如果你使用,这将工作正常

 result.Add(obj); 

最后一行是return result;

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

你错过了return语句。

 return result;