【问题标题】:Iterating through a list with a different type遍历具有不同类型的列表
【发布时间】:2015-03-25 21:02:52
【问题描述】:

在尝试使用不同类型的列表进行迭代时,我遇到了一些不寻常的事情。我在下面有一些示例代码。

我正在使用两个接口:

interface IViewable
{
    void View();
}

interface IHideable
{
    void Hide();
}

还有以下类:

class AwesomeClass : IViewable, IHideable
{
    public void Hide()
    {
        Console.WriteLine("Le hiding.");
    }

    public void View()
    {
        Console.WriteLine("Le toucan has arrived.");
    }
}

class LessAwesomeClass : IViewable
{
    public void View()
    {
        Console.WriteLine("Le arrival.");
    }
}

注意:LessAwesomeClass继承 IHideable

这是一个使用这些的示例控制台应用程序:

static void Main(string[] args)
    {
        List<IViewable> viewable = new List<IViewable>();

        viewable.Add(new AwesomeClass());
        viewable.Add(new LessAwesomeClass());

        //This runs fine.
        foreach (IViewable view in viewable)
            view.View();

        //Oh no! InvalidCastException
        foreach (IHideable hidable in viewable)
            hidable.Hide();

        Console.Read();
    }

当尝试遍历类型为 IHideable 的列表时,它会抛出 InvalidCastException。这是有道理的,因为它显然试图将项目转换为IHideable。我明白这一点。

现在这里的问题是应用程序编译。我觉得有点奇怪。

这让我感到困惑,因为我正在写这篇文章并在想,“嘿!我可以为每个循环为 IHideable 做一个并过滤掉任何不是 IHideable 的东西,太棒了!哦等等,InvalidCastException。”

所以第一个问题是为什么会编译? 第二个问题,有没有办法在执行 foreach 循环时过滤掉所有不是IHideable 的东西?

无论如何,这样做可能不是一个好主意,更像是一种“我想知道这是否可行”的情况。

【问题讨论】:

    标签: c# foreach interface


    【解决方案1】:

    为什么会编译?

    EricLippert answers it here

    有没有办法过滤掉所有不可隐藏的内容 做一个 foreach 循环?

    是的,使用OfType扩展方法。

    foreach (IHideable hidable in viewable.OfType<IHideable>())
        hidable.Hide();
    

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多