【发布时间】: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 的东西?
无论如何,这样做可能不是一个好主意,更像是一种“我想知道这是否可行”的情况。
【问题讨论】: