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();