C# 我可以从父对象访问子对象变量吗?

C# 我可以从父对象访问子对象变量吗?,c#,class,variables,inheritance,polymorphism,C#,Class,Variables,Inheritance,Polymorphism,假设我有一个叫做“动物”的类,它是由“猫”继承的。 如果我现在有一个动物数组,我可以从中访问cat变量吗(当然,如果动物也是猫的话)?您可以使用运算符 is运算符检查表达式的结果是否兼容 使用给定类型,或(从C#7.0开始)测试表达式 与模式相反 注意:是C#7.0版的操作员支持您可以将动物投射到猫身上。有多种方法可以做到这一点((猫)MyAnimal).Purr()或(MyAnimal作为猫).Purr()或更好的如果(MyAnimal是猫)myCat.Purr()考虑当每只猫都是动物时,不是

假设我有一个叫做“动物”的类,它是由“猫”继承的。 如果我现在有一个动物数组,我可以从中访问cat变量吗(当然,如果动物也是猫的话)?

您可以使用运算符

is运算符检查表达式的结果是否兼容 使用给定类型,或(从C#7.0开始)测试表达式 与模式相反


注意:
是C#7.0版的操作员支持
您可以将动物投射到猫身上。有多种方法可以做到这一点
((猫)MyAnimal).Purr()
(MyAnimal作为猫).Purr()
或更好的
如果(MyAnimal是猫)myCat.Purr()
考虑当每只
都是
动物时,不是每只
动物
都是
,因此转换可能失败。无论如何:有数百个类似的问题,只要搜索并尝试一下。或者你可以使用所有类都可用的
Object.GetType()
。那么您就不必依赖新版本的
C#
@RyanWilson模式匹配不是检查变量是否属于给定类型<代码>动物是猫
从C#1开始工作。这只是执行强制转换并返回结果的一种方便方式,就像执行强制转换并检查null一样。是的,正如希姆布罗姆比尔所说,
动物是猫
不是模式匹配。C#7支持将动物转换为lovelyCat。如果您使用的是C#的较低版本,则需要将条件语句拆分为两行,例如,
If(animal is Cat){var lovelyCat=(Cat)animal;。}
@HimBromBeere
Object.GetType()
仍然有效,您需要在施放之前检查
animal
是否是
。@RyanWilson当然,但是使用
GetType
执行此操作不会覆盖所有情况,例如,如果某个对象继承了
Cat
,则不会覆盖所有情况。当然,这超出了问题的范围,但我不想用
动物是猫而不是
动物。GetType()==typeof(Cat)
foreach(var animal in animals)
{
   if(animal is Cat lovelyCat)
   {
      //You can use lovelyCat as object of Cat
   }
}