为什么切换模式匹配不起作用?

时间:2017-09-18 11:49:16

标签: c# .net uwp visual-studio-2017

更新 问题出在调用代码中。 ReSharper对多个枚举进行了讨论并生成了此代码。

Firebase-root
   |
   --- Schools
   |      |
   |      --- schoolId1
   |              |
   |              --- schoolName: School Name 1
   |              |
   |              --- Period1: EndTime
   |              |
   |              --- Period2: EndTime
   |              |
   |              --- Districts
   |                     |
   |                     --- District1: true
   |                     |
   |                     --- District2: true
   |
   --- Districts
          |
          --- DistrictId1
                  |
                  --- districtsName: Districts Name 1
                  |
                  --- Schools
                         |
                         --- School1: true
                         |
                         --- School2: true

当我这样离开时,一切运作良好。

public async Task SendItemsToMovements(IEnumerable<object> items)
{
    var enumerable = items as IList<object> ?? items.ToList();

    if (!enumerable.Any())
    {
        return;
    }
    var arrayOfArraysForUpsert = ItemsToUpsertStringConverter.GetString(enumerable);
}

谢谢大家!

我有这个代码的UWP应用程序(c#7,vs2017)。 当public async Task SendItemsToMovements(IEnumerable<object> items) { if (!items.Any()) { return; } var arrayOfArraysForUpsert = ItemsToUpsertStringConverter.GetString(items); } items IEnumerable<Material>案例IEnumerable<Material> materials未被解雇并被解雇default时。为什么呢?

    public static string GetString(IEnumerable<object> items)
    {
        switch (items)
        {
            case IEnumerable<Material> materials:

                foreach (var material in materials)
                {
                }
                break;

            case IEnumerable<Movement> movements:

                foreach (var item in movements)
                {
                }
                break;

            default:
                return string.Empty;
        }

        return "...";
    }

enter image description here

enter image description here

感谢您的任何想法。

2 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为在C#中,反演不能自动收集。你需要手动投射它。

您可以尝试这样的事情

public static string GetString<T>(IEnumerable<T> items)
{
    if (typeof(T) == typeof(Material))
    {
        foreach (var material in items.Cast<Material>())
        {
        }
    }
    if (typeof(T) == typeof(Movement))
    {
        foreach (var material in items.Cast<Movement>())
        {
        }
    }

    return "...";
}

答案 1 :(得分:-1)

您无法将IEnumerable<object> items投放到List<Material>IEnumerable<object>是一种没有List<Material>插入的类型。

你应该得到第一个获得该类型的项目然后投射它。我编写代码来做到这一点。

public static string GetString(IEnumerable<object> items)
 { 
    var item = items.FirstOrDefault();
    if(item == null)
    {
        return string.Empty;
    }
    switch(item)
    {
        case Material material:
          foreach(var temp in items.Cast<Material>())
          {

          }
          break;
        case Movement movement:
        foreach (var temp in items.Cast<Movement>())
        {
        }
            break;
        default:
            return string.Empty;
    }
    return "...";

}