【问题标题】:Cannot Implicityly Convert Type Void To Type System.Collections.Generic.IList<T>无法将类型 Void 隐式转换为类型 System.Collections.Generic.IList<T>
【发布时间】:2011-02-03 00:24:14
【问题描述】:

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

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

        }

【问题讨论】:

  • 对 Switch-case 的使用不当,因为不需要使用不做任何事情的情况...
  • 它不完整 - 我需要为其中一些添加存储库模式......我现在只是打破不完整的模式。

标签: c# generics


【解决方案1】:
result = result.Add(obj);

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

【讨论】:

  • 一个有效点,但不是错误的实际原因。 +1 是一个很好的观点(并且欢迎使用 SO)。
  • 是的,但您仍应在末尾添加return result;
  • ……并在某处初始化result
  • @Martinho Fernandes:哇,这对我来说是一个令人尴尬的评论。你是完全正确的,我完全没有正确地考虑它。我很想删除评论,但我想我会把它留在那里,这样你的评论仍然有意义,并提醒我注意并思考
【解决方案2】:

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

result.Add(obj);

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

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

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

return result;

根据您的 cmets,CustomerRepository.GetAllCustomers();FacilityRepository.GetAllFacilities(); 等方法返回 IEnumerable&lt;Customer&gt;IEnumerable&lt;Facility&gt; 或类似的实例。您将这些转换为 T。这意味着所有这些类型都必须转换为 T。

我猜你想要的是获取这些集合中的所有项目并将它们添加到列表中。如果是这种情况,您应该改为转换为 IEnumerable&lt;T&gt;,并调用 AddRange 方法。

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

【讨论】:

  • @Code Sherpa:如果没有更多细节(例如什么是仪表板组,以及如何、在何处以及为您调用 GetGroupById 的方式),很难说更多。也许您可以发布另一个问题,更好地详细说明您的目标是什么。
  • 谢谢 Martinho,我现在就去做...感谢您的帮助。
  • 嗨 Martinho,我已经发布了我在这里所做的背景:stackoverflow.com/questions/4877757/… 感谢您的反馈。
【解决方案3】:

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

编辑:

实际上,经过进一步审查,我意识到问题在于result.Add 返回 void,而行

result = result.Add(obj); 正在尝试将其分配给结果(即List)。这就是该行出现错误的原因,但您还需要返回结果并在添加任何内容之前对其进行实例化。

【讨论】:

    【解决方案4】:

    你为什么要分配结果

    result = result.Add(obj);

    如果你使用,这会很好用

    result.Add(obj);
    

    最后一行是return result;

    【讨论】:

      【解决方案5】:

      两件事:您应该在最后返回结果,并且在开始时声明结果时,您应该将其声明为新 List 而不是 null。

      【讨论】:

        【解决方案6】:

        您缺少返回语句。

        return result;
        

        【讨论】:

          猜你喜欢
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          • 2013-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多