C# 使用不同类型遍历列表

C# 使用不同类型遍历列表,c#,foreach,interface,C#,Foreach,Interface,我在尝试使用不同类型的列表进行迭代时遇到了一些不寻常的事情。下面是一些示例代码 我使用两个接口: interface IViewable { void View(); } interface IHideable { void Hide(); } 以及下列类别: class AwesomeClass : IViewable, IHideable { public void Hide() { Console.WriteLine("Le hiding

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

我使用两个接口:

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();
    }
static void Main(字符串[]args)
{
列表可查看=新列表();
添加(新的AwesomeClass());
添加(新的LessAwesomeClass());
//这个很好。
foreach(可视中的iView视图)
view.view();
//哦,不!无效的例外
foreach(IHideable在可视中隐藏)
hidable.Hide();
Console.Read();
}
当尝试遍历类型为
IHideable
的列表时,它抛出InvalidCastException。这是有道理的,因为它显然试图将项目强制转换为
IHideable
。我明白这一点

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

这就是让我困惑的地方,当我写这篇文章时,我在想,“嘿!我可以为IHideable做一个for-each循环,过滤掉任何不可IHideable的东西,太好了!哦,等等,InvalidCastException。”

所以第一个问题是为什么要编译? 第二个问题是,在执行foreach循环时,是否有一种方法可以过滤掉所有我不喜欢的东西

不管怎样,这样做可能不是一个好主意,更多的是一种“我想知道这是否可行”的情况

为什么要编译

有没有一种方法可以过滤掉我不喜欢的东西 做foreach循环

是的,使用扩展方法

foreach (IHideable hidable in viewable.OfType<IHideable>())
    hidable.Hide();
foreach(IHideable在viewable.OfType()中隐藏)
hidable.Hide();
为什么要编译

有没有一种方法可以过滤掉我不喜欢的东西 做foreach循环

是的,使用扩展方法

foreach (IHideable hidable in viewable.OfType<IHideable>())
    hidable.Hide();
foreach(IHideable在viewable.OfType()中隐藏)
hidable.Hide();