尝试返回泛型类型并收到标题中描述的错误。 我确信我正在做一些愚蠢的事情 - 建议赞赏......
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
}
答案 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;